列表中包含公共元素的Python合并列表

时间:2017-09-05 01:46:24

标签: python list merge

我从.c读取输入的.csv文件。它包含用户名和一些其他用户信息。

一个用户可能会被列出多次,因此我想列出列表中一个用户的所有元素。

所以,我的代码是:

import csv

with open('raw_input.csv', 'r') as f:
    reader = csv.reader(f)
    rawInput = list(reader)

concat = []
for elements in rawInput[1:]:
    print(elements)
    concat.append([elements[0], elements[1] + "_" + elements[2] + "_" + elements[3]])
concat

 [['User 1', 'u1-c1_p1_1'],
 ['User 1', 'u1-c2_p2_2'],
 ['User 2', 'u2-c1_p1_3'],
 ['User 3', 'u3-c1_p2_4'],
 ['User 4', 'u4-c1_p3_1'],
 ['User 4', 'u4-c2_p4_6']]

它应该是这样的:

[['User 1', 'u1-c1_p1_1', 'u1-c2_p2_2'],
 ['User 2', 'u2-c1_p1_3'],
 ['User 3', 'u3-c1_p2_4'],
 ['User 4', 'u4-c1_p3_1', 'u4-c2_p4_6']]

1 个答案:

答案 0 :(得分:1)

您非常接近解决方案。您需要的是defaultdict

from collections import defaultdict
import itertools
d = defaultdict(list)
for user, date in concat:
   d[user].append(date)

final_data = [list(itertools.chain.from_iterable([[a], b])) for a, b in d.items()]

输出:

[['User 4', 'u4-c1_p3_1', 'u4-c2_p4_6'], ['User 3', 'u3-c1_p2_4'], ['User 2', 'u2-c1_p1_3'], ['User 1', 'u1-c1_p1_1', 'u1-c2_p2_2']]