Python将元素列表(value,id)合并到element:list(value,value2,id)

时间:2013-06-12 09:31:38

标签: python

您好我有两个ID为

的列表
[(u'0', 1), (u'3000', 2), (u'10000', 3), (u'20000', 4)]
[(u'2999', 1), (u'9999', 2), (u'19999', 3), (u'999999999', 4)]

两个列表的ID始终为1,2,3,4 我怎么能合并列表有这样的东西:

[('0', '2999', 1), ('3000', '9999', 2), etc...]

有一种简单的方法吗?

我的意思是拉链,我会得到:

[((u'0', 1), (u'2999', 1)), ((u'3000', 2), (u'9999', 2)), ((u'10000', 3), (u'19999', 3)), ((u'20000', 4), (u'999999999', 4))]

但这不是我想要的。 我仍然想要上述内容,我真的不知道应该怎么做。

3 个答案:

答案 0 :(得分:3)

如果您想在同一位置加入元素,您可以这样做:

[(a,b,key) for (a,key),(b,_) in zip(first_list, second_list)]

用法:

>>> A = [(u'0', 1), (u'3000', 2), (u'10000', 3), (u'20000', 4)]
>>> B = [(u'2999', 1), (u'9999', 2), (u'19999', 3), (u'999999999', 4)]
>>> [(a,b,key) for (a,key),(b,_) in zip(A,B)]
[(u'0', u'2999', 1), (u'3000', u'9999', 2), (u'10000', u'19999', 3), (u'20000', u'999999999', 4)]

如果具有相同“id”的元素可能不在同一位置,您可以使用key=lambda x:x[1]对它们进行排序,然后使用上面的列表推导。 或者,您可以使用defaultdict(list),如Ashwini的回答。

答案 1 :(得分:1)

你应该在这里使用字典:

>>> from collections import defaultdict
>>> from itertools import chain
>>> lis1 = [(u'0', 1), (u'3000', 2), (u'10000', 3), (u'20000', 4)]
>>> lis2 = [(u'2999', 1), (u'9999', 2), (u'19999', 3), (u'999999999', 4)]
>>> dic = defaultdict(list)
>>> for v, k in chain(lis1,lis2):
    dic[k].append(v)
...     
>>> dic.default_factory  = None  # now missing IDs will raise KeyError

现在可以访问与任何ID相关的项目:

>>> dic[1]
[u'0', u'2999']
>>> dic[2]
[u'3000', u'9999']

答案 2 :(得分:1)

使用map

>>> a = [(u'0', 1), (u'3000', 2), (u'10000', 3), (u'20000', 4)]
>>> b = [(u'2999', 1), (u'9999', 2), (u'19999', 3), (u'999999999', 4)]
>>> map(lambda ((a,k),(b,_)): (a,b,k), zip(a,b))
[(u'0', u'2999', 1), (u'3000', u'9999', 2), (u'10000', u'19999', 3), (u'20000', u'999999999', 4)]

这在Python 3中不起作用,所以如果你想使用这个方法,你将不得不求助于那种不易理解的表达式:

>>> list(map(lambda a: (a[0][0],a[1][0],a[0][1]), zip(a,b)))
[('0', '2999', 1), ('3000', '9999', 2), ('10000', '19999', 3), ('20000', '999999999', 4)]