2

您好,我有两个带有 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...]

有没有简单的方法可以做到这一点?

我的意思是使用 zip 我会得到:

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

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

4

3 回答 3

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”的元素可能不在同一位置,您可以使用 a 对它们进行排序,key=lambda x:x[1]然后使用上面的列表理解。或者,您可以使用defaultdict(list),如 Ashwini 的回答。

于 2013-06-12T09:35:10.270 回答
1

使用地图

>>> 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)]
于 2013-06-12T09:36:42.350 回答
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']
于 2013-06-12T09:34:59.063 回答