在嵌套列表中查找唯一的子列表
Finding unique sub-lists in nested lists
很长一段时间以来,我一直在努力解决以下问题:
考虑以下示例嵌套列表:example_nestedlist = [['Apple', 'Orange'], ['Apple', 'Orange'], ['Apple', 'Banana'], ['Apple', 'Banana', 'Strawberry'], ['Apple', 'Banana', 'Strawberry']]
这是我根据产品数据生成的众多嵌套列表之一,对于这些嵌套列表中的每一个(包含 1-100 个列表),我想重新创建嵌套列表,使其包含 只有独特的子列表。
预期的输出可能如下所示:
output_nestedlist = [['Apple'], ['Orange'], ['Banana'], ['Strawberry'], ['Apple', 'Banana']]
.
预期的输出不限于此。例如,第二个子列表也可以是 ['Apple', 'Orange']
,而不仅仅是 ['Orange']
。
最终目标仍然是拥有独特的子列表,而不管这些子列表中实际包含什么(或它们的长度)。
我已经探索了几种方法,例如:
- 使用
set()
生成尽可能多的 'different' 个独特的子列表。
- 同时还使用
set()
检测完全相似的子列表,在这种情况下,我使用随机化 select 项目出现在子列表中。
- 这两种方法之后都是我创建的大量 'rules' 来捕获异常。
然而,这导致(并且仍然导致)一种非常不可扩展的方法,因为它现在更多地关注嵌套列表中的内容,而不是问题本身。
也许我错过了什么,只需要一些 rubber ducking 在这里..
但我希望有人能给我一个研究的方向,非常感谢所有帮助!
edit1:保留子列表的顺序也很重要,因为稍后需要将它们连接到它们的唯一标识符。
注意:已删除最后一个答案,因为它不符合要求。
看来您需要使用组合。
结果符合条件:
- 结果列表应与输入列表长度相同
result
中的每个项目都应该是 input
列表中相应项目的子集
- 结果列表不应有重复的子列表。
from itertools import combinations
example_nestedlist = [['Apple', 'Orange'], ['Apple', 'Orange'], ['Apple', 'Banana'], ['Apple', 'Banana', 'Strawberry'], ['Apple', 'Banana', 'Strawberry']]
result = []
def fill_load(sublist):
for i in range(1, len(sublist) + 1):
for combo in combinations(sublist, i):
item = list(combo)
if item not in result:
result.append(item)
return
result.append(None)
for sublist in example_nestedlist:
fill_load(sublist)
print(result)
输出:
[['Apple'], ['Orange'], ['Banana'], ['Strawberry'], ['Apple', 'Banana']]
很长一段时间以来,我一直在努力解决以下问题:
考虑以下示例嵌套列表:example_nestedlist = [['Apple', 'Orange'], ['Apple', 'Orange'], ['Apple', 'Banana'], ['Apple', 'Banana', 'Strawberry'], ['Apple', 'Banana', 'Strawberry']]
这是我根据产品数据生成的众多嵌套列表之一,对于这些嵌套列表中的每一个(包含 1-100 个列表),我想重新创建嵌套列表,使其包含 只有独特的子列表。
预期的输出可能如下所示:
output_nestedlist = [['Apple'], ['Orange'], ['Banana'], ['Strawberry'], ['Apple', 'Banana']]
.
预期的输出不限于此。例如,第二个子列表也可以是 ['Apple', 'Orange']
,而不仅仅是 ['Orange']
。
最终目标仍然是拥有独特的子列表,而不管这些子列表中实际包含什么(或它们的长度)。
我已经探索了几种方法,例如:
- 使用
set()
生成尽可能多的 'different' 个独特的子列表。 - 同时还使用
set()
检测完全相似的子列表,在这种情况下,我使用随机化 select 项目出现在子列表中。 - 这两种方法之后都是我创建的大量 'rules' 来捕获异常。
然而,这导致(并且仍然导致)一种非常不可扩展的方法,因为它现在更多地关注嵌套列表中的内容,而不是问题本身。 也许我错过了什么,只需要一些 rubber ducking 在这里..
但我希望有人能给我一个研究的方向,非常感谢所有帮助!
edit1:保留子列表的顺序也很重要,因为稍后需要将它们连接到它们的唯一标识符。
注意:已删除最后一个答案,因为它不符合要求。
看来您需要使用组合。 结果符合条件:
- 结果列表应与输入列表长度相同
result
中的每个项目都应该是input
列表中相应项目的子集- 结果列表不应有重复的子列表。
from itertools import combinations
example_nestedlist = [['Apple', 'Orange'], ['Apple', 'Orange'], ['Apple', 'Banana'], ['Apple', 'Banana', 'Strawberry'], ['Apple', 'Banana', 'Strawberry']]
result = []
def fill_load(sublist):
for i in range(1, len(sublist) + 1):
for combo in combinations(sublist, i):
item = list(combo)
if item not in result:
result.append(item)
return
result.append(None)
for sublist in example_nestedlist:
fill_load(sublist)
print(result)
输出:
[['Apple'], ['Orange'], ['Banana'], ['Strawberry'], ['Apple', 'Banana']]