我有两个列表列表(包含整数),第一个列表是“种子”列表,第二个列表是“新”列表。我希望使用新列表中但不在种子列表中的列表来增加种子列表,以及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
答案 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