0

特定のインデックスで共通の値を共有している場合、あるサブリストを別のサブリストで拡張する最も効率的な方法は何ですか? List1 のインデックス 0 の値が List2 のインデックス 0 の値と等しい場合、2 つのサブリストをマージしたいと思います。

List1 = [['aaa','b','c'],['ddd','e','f']]
List2 = [['aaa','1','2'],['ddd','3','4']]

望ましい出力:

[['aaa','b','c','aaa','1','2'],['ddd','e','f','ddd','3','4']]

私のハック:

from collections import defaultdict

Keys2 = map(lambda x: x[0], List2) #returns ['aaa','ddd']
List2_of_Tuples = zip(Keys,List2) #returns [('aaa',['aaa','1','2']),('ddd',['ddd','3','4'])]

Keys1 = map(lambda x: x[0], List1) 
List1_of_Tuples = zip(Keys,List1)

Merged_List_of_Tuples = List1_of_Tuples + List2_of_Tuples
d = defaultdict(list)
for k,v in Merged_List_of_Tuples:
    d[k].append(v)

Desired_Result = map(lambda x: [item for sublist in x[1] for item in sublist],d.items())

これは以下を返します:

[['aaa', 'b', 'c', 'aaa', '1', '2'], ['ddd', 'e', 'f', 'ddd', '3', '4']]

これを 2 つ以上の大きなリストに対して行っています。これを行うためのより短いより効率的な方法はありますか?

4

5 に答える 5

2

リスト内包表記を使用します。

List1 = [['aaa','b','c'],['ddd','e','f']]
List2 = [['aaa','1','2'],['ddd','3','4']]

new_list = [a + b for a, b in zip(List1, List2) if a[0] == b[0]]

結果:

>>> new_list
[['aaa', 'b', 'c', 'aaa', '1', '2'], ['ddd', 'e', 'f', 'ddd', '3', '4']]
于 2014-01-25T04:09:40.430 に答える
1
list1,list2 = [['aaa','b','c'],['ddd','e','f']],[['aaa','1','2'],['ddd','3','4']]

from itertools import chain, groupby
from operator import itemgetter
get_first, result = itemgetter(0), []
for key, grp in groupby(sorted(chain(list1, list2), key = get_first), get_first):
    result.append([item for items in grp for item in items])
print result

出力

[['aaa', 'b', 'c', 'aaa', '1', '2'], ['ddd', 'e', 'f', 'ddd', '3', '4']]
于 2014-01-25T04:12:26.720 に答える
0

List1必ずしも一致するアイテムがあるとは限らないと思いList2ますか?

どうですか:

list2_keys = map(lambda x:x[0],List2)
for i,l in enumerate(List1):
    if l[0] in list2_keys:
        List1[i].extend(List2[list2_keys.index(l[0])])

または、その場でリストを変更したくない場合:

list2_keys = map(lambda x:x[0],List2)
new_list = []
for i,l in enumerate(List1):
    if l[0] in list2_keys:
        new_list.append(List1[i]+List2[list2_keys.index(l[0])])
于 2014-01-25T04:14:56.777 に答える
0
print [List1[0]+List2[0],List1[1]+list2[1]]
于 2014-01-25T04:15:41.397 に答える
0

別のアプローチを次に示します。

List1 = [['aaa','b','c'],['ddd','e','f'],['a','b'],['k','l']]
List2 = [['aaa','1','2'],['ddd','3','4'],['c','d']]
new_list = []

for (index, elem) in enumerate(List1):
    try:
        if elem[0] == List2[index][0]:
            new_list.append(elem+List2[index])
    except IndexError:
        break

print new_list
于 2014-01-25T04:35:33.687 に答える