2

こんにちは、ID を持つ 2 つのリストがあります

[(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」を持つ要素が同じ位置にない可能性がある場合は、akey=lambda x:x[1]を使用して並べ替えてから、上記のリスト内包表記を使用できます。あるいはdefaultdict(list)、Ashwini の回答のように を使用することもできます。

于 2013-06-12T09:35:10.270 に答える
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 に答える