【问题标题】:Finding unique sub-lists in nested lists在嵌套列表中查找唯一的子列表
【发布时间】:2020-07-16 21:32:09
【问题描述】:

很长一段时间以来,我一直在努力解决以下问题:

考虑以下示例嵌套列表: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() 生成尽可能多的“不同”唯一子列表。
  • 同时使用set() 检测完全相似的子列表,在这种情况下,我使用随机化来选择要出现在子列表中的项目。
  • 这两种方法都遵循了我为捕获异常而创建的大量“规则”。

但是,这导致(并且仍然导致)一种非常不可扩展的方法,因为它现在非常关注嵌套列表中的内容,而不是问题本身。 也许我错过了什么,只是需要一些橡皮擦在这里..

但我希望有人能给我一个研究方向,非常感谢所有帮助!

edit1:保留子列表的顺序也很重要,因为稍后需要将它们连接到它们的唯一标识符。

【问题讨论】:

  • 尚不清楚子列表的独特之处。它们不包含相同的项目?如果是这样,不就是set(tuple(subl) for subl in sublists)吗?
  • 理想情况下,如果有多个解决方案,则显示一个输入集和所有有效结果。这将确保我们真正了解您的要求
  • @ReutSharabani 对不起,我的错!唯一性意味着没有一个子列表与另一个子列表完全相同,无论是长度还是其中的项目。它们可能都包含相似的项目,只要每个子列表之间始终存在差异。
  • @gelonida 你是对的,但我希望“所有可能的组合”都可以。每个子列表中的内容无关紧要,只要所有子列表都是唯一的(意味着没有两个子列表中的项目完全相同)。我试图在这里将其表示为“简单”示例,但是在我的实际工作数据集中,有嵌套列表包含子列表,其中每个子列表都有大约 10-25 个项目。
  • @ReutSharabani 不幸的是,该解决方案不起作用,主要是因为它忽略了嵌套列表中子列表的顺序。应该将其添加到要求中:)

标签: python unique nested-lists


【解决方案1】:

注意:删除最后一个答案,因为它不符合要求。

看来您需要使用组合。 结果符合条件:

  1. 结果列表的长度应与输入列表的长度相同
  2. result 中的每个项目都应该是 input 列表中相应项目的子集
  3. 结果列表不应有重复的子列表。
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 中的每个子列表。将它们视为 5 辆“食品卡车”,它们都携带几种水果(输入),这可能是完全重复的,但是当我最终“打开”每辆卡车时,我想在每辆卡车中看到不同的水果组合。因此卡车 1 可能有 ['Apple'],卡车 2 ['Apple', 'Orange']。但是卡车 1 也可以有 ['Orange'] 和卡车 2 ['Apple']。但卡车 1 也可以有 ['Apple', 'Orange'],卡车 2 可以有 ['Apple']['Orange']
  • 只要每辆卡车都有独特的“负载”,每辆卡车运载的水果组合如何都无关紧要。但关键是所有 5 辆卡车(在本例中)都需要携带一种或多种水果。
  • 所以根据输入列表,卡车 1 可以携带 ['Banana'] 还是必须是 ['Apple']['Orange']['Apple', 'Orange']
  • 后者,子列表是“固定的”,就可能的项目而言。所以项目不能在子列表之间交换:)
  • 更新了答案,如果仍然不符合您的任何要求,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2022-01-14
  • 2018-03-23
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多