【问题标题】:Python: How to only retain elements from all previous sublists while iterating over list?Python:如何在迭代列表时只保留所有先前子列表中的元素?
【发布时间】:2016-04-07 13:38:46
【问题描述】:

这就是我所拥有的:

 lst = [[1,4,5,9], [4,5,7,9], [6,2,9], [4,5,9], [4,5]]

我想创建一个新列表,其中子列表仅包含与所有先前子列表共享的元素。

应该是这样的:

new_lst = [[1,4,5,9], [4,5,9], [9], [9], []]

我尝试将整数转换为字符串并对其进行迭代,但我似乎无法得到正确的结果。我是 python 新手,非常感谢任何帮助!

【问题讨论】:

  • 那不是有效的 Python 代码。您的意思是在子列表之间添加逗号吗?
  • 你应该展示你已经尝试过的东西,表明你至少已经付出了努力。

标签: python list loops integer list-comprehension


【解决方案1】:

如果您不关心项目的顺序,可以使用基于set 的方法:

last = set(lst[0])
res = [lst[0]]
for item in lst[1:]:
    last &= set(item)
    res.append(list(last))

这里,res 包含列表的结果列表。重要的一行是last &= set(item),它计算上一个项目和当前项目之间的交集。

【讨论】:

  • 您将如何从右侧执行此操作?我尝试使用 lst[-1] 而不是 lst[0],对于循环我做了 lst[:-2:-1] 但它似乎不起作用。
  • 您将从lst[-1] 开始并迭代lst[-2::-1],这基本上是反向迭代所有内容。
  • 更简单:… res = []; for item in lst: …。此外,使用sorted 而不是list 进行确定性输出。
  • 从右到左:for item in reversed(lst): ….
  • 是的,但是遍历整个列表会产生一个额外的列表交集,这是我想避免的。使用sorted 肯定是可能的,但不清楚 OP 的用例是什么,因此我提出了最简单的解决方案。
【解决方案2】:

您可以使用accumulate

from itertools import accumulate
new_lst = map(list,accumulate(map(set,lst), set.intersection))
print(list(new_lst))

产生

[[1, 4, 5, 9], [4, 5, 9], [9], [9], []]

但不保证子列表的项目顺序相同。

如果您确实关心项目的顺序,您可以手动完成

last = set(lst[0])
new_lst = [lst[0]]
for l in lst[1:]:
    new_els = [n for n in l if n in last]
    new_lst.append(new_els)
    last &= set(new_els)

print(new_lst)

或者只是忽略集合而使用列表,但集合更快,因为它们是散列的,并且交集是核心功能。

【讨论】:

  • 我喜欢这个解决方案,但我认为它不会保留子列表中项目的顺序,因为它还使用集合交互。
【解决方案3】:

一行回答:

>>> from functools import reduce   # for forward compatible.
>>> lst = [[1,4,5,9], [4,5,7,9], [4,5,7,9], [4,5,9], [4,5]]
>>> [list(reduce(lambda x,y: set(x)&set(y), lst[:i+1])) for i in range(len(lst))]
[[1, 4, 5, 9], [9, 4, 5], [9], [9], []]

解释:

[1, 4, 5, 9] = list(set([1, 4, 5, 9]))
[9, 4, 5] = list(set([1, 4, 5, 9]) & set([4,5,7,9]))
[9] = list(set([1, 4, 5, 9]) & set([4,5,7,9]) & set([4,5,7,9]))
...

i'st 循环中,它应该联合lst[:i+1] 中的项目。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多