【问题标题】:Duplicate elements in a list列表中的重复元素
【发布时间】:2013-01-30 11:22:32
【问题描述】:

我在 Python 中有一个 list

l = ['a', 'c', 'e', 'b']

我想复制原始元素旁边的每个元素。

ll = ['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']

应保留元素的顺序。

【问题讨论】:

标签: python list list-comprehension


【解决方案1】:
>>> l = ['a', 'c', 'e', 'b']
>>> [x for pair in zip(l,l) for x in pair]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']

或者

>>> from itertools import repeat
>>> [x for item in l for x in repeat(item, 2)]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']

【讨论】:

  • 请注意,这不适用于可以耗尽的任意迭代。
  • @Lattyware:是的,但它确实可以解决所描述的问题。
  • 确实,这只是需要记住的一点,以防有人试图将其应用于其他情况。
  • @Lattyware:第二版中解决了问题。
  • 是的,我唯一的问题是多循环列表 comp 是一种相对低效的扁平化列表的方法。在这种情况下,可能并不重要,但也有点难以阅读。也就是说,这并没有错,其他答案已经建议itertools.chain.from_iterable(),所以没什么大不了的。
【解决方案2】:

这是旧的,但我在这里看不到直接的选项(IMO):

[ item for item in l for repetitions in range(2) ]

所以针对具体情况:

>>> l = ['a', 'c', 'e', 'b']
l = ['a', 'c', 'e', 'b']
>>> [ i for i in l for r in range(2) ]
[ i for i in l for r in range(2) ]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
>>> 

和概括:

[ item for item in l for _ in range(r) ] 

其中 r 是您想要的重复次数。

所以这有一个 O(n.r) 的空间和时间复杂度,很短,没有依赖,也很惯用。

【讨论】:

  • 也可以在 Python 3 中使用,正是我想要的 :)
【解决方案3】:
import itertools

ll = list(itertools.chain.from_iterable((e, e) for e in l))

工作中:

>>> import itertools
>>> l = ['a', 'c', 'e', 'b']
>>> ll = list(itertools.chain.from_iterable((e, e) for e in l))
>>> ll
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']

正如 Lattyware 指出的那样,如果您想要的不仅仅是双倍的元素:

from itertools import chain, repeat

ll = list(chain.from_iterable(repeat(e, 2) for e in l))

【讨论】:

  • 让这更灵活一点itertools.repeat() 可能是一个更好的选择。
  • 我想你想要chain.from_iterable
  • 很抱歉,我必须进行编辑以删除chain 与其参数列表之间的空格。此外,按照 mgilson 的建议,通过使用 chain.from_iterable() 进行修复。我还酌情在参数之间添加了空格,并更改了_ - 通常用于表示丢弃值。
  • @Lattyware,没关系。我对空间无能为力(我工作的编码标准,是的。很难改掉这个习惯)。但你只是把我打到了from_iterable
  • @StoryTeller 真的吗?太糟糕了。这直接违背了 PEP-8 的建议,我(个人)认为它丑得要命。
【解决方案4】:

试试这个

for i in l:
    ll.append(i)
    ll.append(i)

Demo

它只会完成你的工作,但它不是一种优化的方式。

使用答案。由@Steven Rumbalski 发布

【讨论】:

  • 这是一种相对低效的方法。
  • @Lattyware 同意,但这个问题。不应该得到更多。没有提到它需要优化的解决方案。它只是想要一个解决方案。
  • 这是一种疯狂的看待方式。更好的答案通常是与此类似的代码量,并且总是值得以最好的方式做事,而不需要额外的努力。
  • 好的@Lattyware 下次我会记住这一点。但我现在能做什么。(解决方案已经给出,特斯拉自己也知道答案。)
  • 我在哪里说过您需要对此做些什么?这是答案的有效解决方案,我只是评论说它效率相对较低,并且没有投票,因为它不是一个特别有用的解决方案。
【解决方案5】:

这是一个非常简单的方法:

sum(zip(l, l), tuple())

它复制每个项目,并将它们添加到一个元组中。如果你不想要一个元组(我怀疑),你可以在元组上调用list

list(sum(zip(l, l), tuple()))

其他几个版本(产生列表):

list(sum(zip(l, l), ()))

sum([list(i) for i in zip(l, l)], [])

sum(map(list, zip(l, l)), [])

【讨论】:

  • 这行得通,但它需要二次时间。这是一个非常糟糕的选择。
【解决方案6】:

Pandas 给出了重复元素的方法:

import pandas as pd
l = pd.Series([2, 1, 3, 1])
print(l.duplicated())
>>>0    False
   1    False
   2    False
   3     True
   dtype: bool

print('Has list duplicated ? :', any(l.duplicated()))
>>>Has list duplicated ? : True

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2023-04-05
    • 1970-01-01
    • 2012-10-10
    • 2022-01-24
    • 2012-10-12
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多