【问题标题】:How to make sublists comprised of unique values from a larger list - python [closed]如何使子列表由更大列表中的唯一值组成 - python [关闭]
【发布时间】:2016-03-12 03:31:46
【问题描述】:

我有一个大列表,我想将其分成具有唯一值的较小列表。

BigList = [2, 1, 0, 2, 2, 1, 2, 1, 0, 3, 0, 1, 3]

如何将其划分为较小的唯一值列表,这些列表最初位于较大的列表中(下面的所需输出):

L1 = [2, 1, 0]

L2 = [2]

L3 = [2, 1]

L4 = [2, 1, 0, 3]

L5 = [0, 1, 3]

请注意,每个子列表都没有重复值,它们可以有不同数量的索引,并且所有子列表中的所有值都存在于原始列表中。

【问题讨论】:

  • 包含 3 个元素、2 个元素、1 个元素等的列表的标准是什么?另外,您是否尝试过为此编写代码?您能否展示您的代码并解释您目前无法解决的问题?
  • 你必须维持秩序吗?这意味着 L1 可能是 [0, 2, 1] 吗?这仍然可以满足您的需求吗?
  • @idjaw:下一个列表在遇到当前正在处理的列表中已经存在的数字时开始。
  • @idjaw 子列表只需要具有来自更大列表的一系列独特元素。我没有尝试过代码——我几周前才开始编程,所以我还在学习基础知识。我不知道如何处理这个问题,我在这里找不到其他相关的问题/答案 sberry 是的,订单仍然是必要的

标签: python list python-3.x unique


【解决方案1】:

这是一个相当简单的方法:

lists = [[]]
for num in BigList:
    if num in lists[-1]:
        lists.append([])
    lists[-1].append(num)

它还保留了顺序。它是这样工作的:它遍历BigList 中的每个数字。如果它已经存在于最后一个列表 (lists[-1]) 中,我们将启动一个新列表。然后我们将num 添加到最后创建的列表中。

【讨论】:

  • 如果你只附加一个空列表,你可以摆脱else:
  • @AChampion 我认为它需要在if 中继续,否则会造成欺骗。
  • 值得注意的是,如果这个BigList 真的是一个BIG LIST,那么它的性能可能很差。
  • 不这么认为...lists.append([]) 意味着以下lists[-1].append(num) 在所有情况下都有效。
  • @AChampion,对...如果 lists.append([num]) 更改为 lists.append([]),那么 else 就可以了。我错过了你评论的结尾append an empty list
【解决方案2】:

也可以使用reduce

reduce(lambda a, b: a[:-1] +[a[-1]+[b]] \
            if (b not in a[-1]) else a+[[b]],     
                 BigList[1:], 
                 [[BigList[0]]])

如果它是像 Haskell 这样的语言,也许可以使用。但是,对于 Python,这可能需要一个性能它。尽管如此,对于足够小的列表来说,它是一个相对简单的实现......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多