您好我有两个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))]
但这不是我想要的。 我仍然想要上述内容,我真的不知道应该怎么做。
答案 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)]