Python - 快速合并两个列表列表的方法

时间:2017-04-14 05:52:33

标签: python list list-comprehension

我有两个列表列表(包含整数),第一个列表是“种子”列表,第二个列表是“新”列表。我希望使用新列表中但不在种子列表中的列表来增加种子列表,以及list(set(seedList[index1] + newList[index2]))之间种子和新列表之间相似(不是不相交)的列表。最终结果将是从新列表中的唯一列表增长的种子列表,并在种子列表和新列表之间扩展类似列表。哇,不确定这是否合理。

种子清单 [[1,2,3], [4,5], [6,7,8]]

新名单 [[1,2], [6,7], [9]]

最终名单 [[1,2,3], [4,5], [6,7,8], [9]]

**编辑**

我在发布这个问题后意识到,我可能通过寻求需要列表清单的解决方案来强迫自己陷入困境。更大的上下文是有两个文件:seed和new。每个文件都有一行ID的逻辑分组。我需要合并这两个文件,但保持每行的逻辑分组。因此,如果种子和新文件之间的两行相同(即1,2,3 == 1,2,3),则将行留在种子文件中,如果两行“相似”(不是不相交的,即6,7,8~6,7))然后合并两行(没有重复)并更新种子文件中的行,如果新文件中有唯一的行(不在种子文件中,即9)添加它到种子文件。

种子档案

1,2,3
4,5
6,7,8

新文件

1,2
6,7
9

最终档案

1,2,3
4,5
6,7,8
9

3 个答案:

答案 0 :(得分:1)

它有点乱,但它有效

Seed_List = [[1,2,3], [4,5], [6,7,8]]
New_List = [[1,2], [6,7], [9]]

Seed_List += [ 
    nl for nl in New_List 
    if sum([ 1 for sl in Seed_List if all(l in sl for l in nl) ]) == 0 
]

输出:

print(Seed_List)
[[1, 2, 3], [4, 5], [6, 7, 8], [9]]

我希望它有用

答案 1 :(得分:1)

对于大量数据,使用索引图的以下方法可能更快。如果您想多次merge,您可能希望保持索引结构是最新的(不确定这是否会产生很大的不同)。

seeds = list(map(set, [[1,2,3], [4,5], [6,7,8]]))
groups = list(map(set, [[1,2], [6,7], [9]]))

def merge(seeds, groups, idx=None):
    if idx is None:
        idx = dict((k, s) for s in seeds for k in s)
    mapped_values = set(idx.keys())
    for new_group in groups:
        common_values = new_group.intersection(mapped_values)
        if common_values:
            mapped_group = idx[common_values.pop()]
            # assert all(mapped_group == idx[v] for v in common_values)
            mapped_group.update(new_group)
        else:
            mapped_group = new_group
            seeds.append(new_group)
        #############################################
        # keep index up-to-date, required only if...
        # - we would want to reuse the index
        # - new groups are not pairwise disjoint
        #
        # for v in new_group:
        #     idx[v] = mapped_group
        # mapped_values.update(new_group)
        #############################################

print(seeds)
print(groups)
merge(seeds, groups)
print(seeds)

# [set([1, 2, 3]), set([4, 5]), set([8, 6, 7])]
# [set([1, 2]), set([6, 7]), set([9])]
# [set([1, 2, 3]), set([4, 5]), set([8, 6, 7]), set([9])]

简明版,假设所有先决条件并且已经过优化'仅限一次合并:

def merge(seeds, groups):
    idx = dict((k, s) for s in seeds for k in s)
    mapped_values = set(idx.keys())
    for new_group in groups:
        common_values = new_group.intersection(mapped_values)
        if common_values:
            idx[common_values.pop()].update(new_group)
        else:
            seeds.append(new_group)

答案 2 :(得分:0)

seed = [[1,2,3], [4,5], [6,7,8]]

new = [[1,2], [6,7], [9]]

flat_seed = [i for j in seed for i in j]
flat_new = [i for j in new for i in j]

seed.append([])

for i in flat_new:
    if i not in flat_seed:
        seed[-1].append(i)
        flat_seed.append(i)

print seed