2012-02-10 92 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