2012-02-10 61 views
3

如何從下面的元組列表中提取不同值的列表?從元組列表中提取不同的值

tuple = ((("test", 123), ("test", 465), ("test", 8910), ("test2", 123))) 

我想得到這樣的列表:

different_values = ("test", "test2") 

現在我想通過這個「鑰匙」來訪問所有的值,並通過列表讓他們:

test_values = (123, 456, 8910) 
test2_values = (123) 

如何去做?

+1

爲什麼在你的元組列表中的額外paranthesis ?在你的例子中也沒有列表(如你所說),但只有元組。 – Nobody 2012-02-10 11:20:15

+2

不要使用'tuple'作爲變量名 - 它會影響內置的。 – 2012-02-10 11:21:50

+1

@沒有人,對不起,錯了。 @斯文,謝謝你的建議。這只是一個例子。 – Razer 2012-02-10 11:22:18

回答

11

我會改變你的數據列表的詞典:

d = {} 
for k, v in tuples: 
    d.setdefault(k, []).append(v) 

現在,您可以訪問鍵作爲d.keys(),和值的每個鍵k作爲d[k]列表。

(不久,有人會挺身而出,要求一個defaultdict會爲了這個美好的,不要聽他們的,它根本就不在這種情況下無所謂。)

+0

出於好奇,斯文,如果你覺得'defaultdict'不會在這裏更好,那麼它什麼時候更好? (我會使用一個,因爲它對我來說似乎更易讀) – unutbu 2012-02-10 11:44:14

+3

@unutbu:對於'defaultdict',每個單鍵查找都可以創建一個新的鍵。在這種情況下,您只想在上面給出的循環中創建新的密鑰 - 如果密鑰不存在,所有以後的查找都會失敗。所以我會使用'defaultdict',如果* all *查找應該添加不存在的鍵,而不僅僅是一些。否則,我更願意明確查找可能會改變字典的查詢。另一種我可能會考慮使用'defaultdict'的情況是,如果缺省值的構造函數昂貴。上面的代碼在每次迭代中創建一個空列表,即使它不是必需的。 ... – 2012-02-10 11:56:34

+0

...由於'defaultdict'的開銷,這實際上比'defaultdict'版本快,但是如果構造函數更昂貴,事情可能會改變。 – 2012-02-10 11:57:33