如何在一个列表中找到重复的元素,并创建另一个包含这些重复元素的列表?

16 浏览
0 Comments

如何在一个列表中找到重复的元素,并创建另一个包含这些重复元素的列表?

如何在一个整数列表中找到重复的元素,并创建另一个包含重复元素的列表?

0
0 Comments

问题的出现原因是用户想要从一个列表中找到重复的元素,并将它们放入另一个列表中。解决方法是使用不同的代码实现来实现这个目标。最常见的方法是使用集合和列表推导式来找到重复的元素。

在提供的代码中,有几种不同的方法来解决这个问题。第一个方法是使用集合和列表推导式,在一个循环中遍历列表,并将重复的元素添加到一个集合中。然后,将集合转换为列表并返回。这个方法的优点是简单和高效。

另一个方法使用了Python的collections.Counter类。这个类可以用来计算列表中元素的频率。然后,使用列表推导式从Counter对象中找到重复的元素,并返回它们。这个方法的优点是使用了Python标准库中的内置功能。

还有一种方法是使用两个集合,一个用于存储已经出现过的元素,另一个用于存储重复的元素。在一个循环中遍历列表,并将元素添加到相应的集合中。最后,将重复的元素转换为列表并返回。这个方法的优点是简单和直观。

在测试代码的性能方面,可以看到不同的方法在不同的情况下有不同的效果。一般来说,使用集合和列表推导式的方法性能较好。然而,当使用pypy解释器时,使用Counter类的方法性能更好。这可能是由于pypy的优化。

解决这个问题的最佳方法是使用集合和列表推导式。它简单、高效,并且在大多数情况下都能提供良好的性能。但是,根据具体的使用情况和数据特点,其他方法也可能是更好的选择。

0
0 Comments

问题原因:问题的出现是因为需要在一个列表中找到重复的元素,并创建另一个包含重复元素的列表。

解决方法:以下是几种解决方法:

1. 使用列表解析的简单解决方法,但时间复杂度为O(n*n)。代码如下:

xs = [1,2,3,4,4,5,5,6,1]
set([x for x in xs if xs.count(x) > 1])

2. 使用生成器解析替代列表解析,可以提高效率。代码如下:

xs = [1,2,3,4,4,5,5,6,1]
set(x for x in xs if xs.count(x) > 1)

3. 使用冒泡排序也可以解决问题,但不推荐使用,因为有更高效(且更简单)的方法来解决排序问题。

4. 一种修复性能问题的简单方法是使用以下代码:

[x for x in set(l) if l.count(x) > 1]

但是,这种方法只能减少最坏情况下的时间复杂度,并不能解决整体的效率问题。因此,在处理大型列表时不推荐使用这种方法。

5. 可以通过以下代码来提高效率:

u = set([])
[u.add(x) for x in l if x not in u and l.count(x) > 1]

但这并不实际返回值列表中的值,只是强调了需要以过程化而不是列表解析的方式来解决问题。

虽然有几种方法可以解决问题,但不推荐使用列表解析的方法,因为其时间复杂度较高。相比之下,使用集合操作可以更高效地解决问题。

0
0 Comments

如何在列表中找到重复项并创建另一个包含重复项的列表?

要删除重复项,请使用set(a)。要打印重复项,可以使用以下代码:

a = [1,2,3,2,1,5,6,5,5,5]
import collections
print([item for item, count in collections.Counter(a).items() if count > 1])
## [1, 2, 5]

注意,Counter并不特别高效(timings),在这里可能有点过度。使用set的性能更好。以下代码按照源顺序计算出一个独特元素的列表:

seen = set()
uniq = []
for x in a:
    if x not in seen:
        uniq.append(x)
        seen.add(x)

或者更简洁地写成:

seen = set()
uniq = [x for x in a if x not in seen and not seen.add(x)]    

我不建议使用后一种风格,因为不明显not seen.add(x)的作用(集合add()方法始终返回None,因此需要使用not)。

要计算列表中的重复元素而不使用库:

seen = set()
dupes = []
for x in a:
    if x in seen:
        dupes.append(x)
    else:
        seen.add(x)

或者更简洁地写成:

seen = set()
dupes = [x for x in a if x in seen or seen.add(x)]    

如果列表元素不可哈希,则无法使用集合/字典,必须采用二次时间复杂度的解决方案(将每个元素与其他元素进行比较)。例如:

a = [[1], [2], [3], [1], [5], [3]]
no_dupes = [x for n, x in enumerate(a) if x not in a[:n]]
print no_dupes # [[1], [2], [3], [5]]
dupes = [x for n, x in enumerate(a) if x in a[:n]]
print dupes # [[1], [3]]

我发现这段代码在列表的列表中不起作用。建议的解决方法适用于列表的列表。我使用的是Python 2.7.6版本。

在你提供的链接中,“Counter不是特别高效(timings)”,Counter在计时上比set更高效...

这看起来很有趣,请问它的时间复杂度是多少?

:我猜是O(n),因为它只迭代一次列表,集合查找是O(1)

要查看重复项的列表,我们只需要创建一个名为dup的新列表,并添加一个else语句。例如:dup = [] else: dup.append(x)

对于Python 3.5,我得到一个指向“for”行的SyntaxError,指向“print [item for item, count in collections.Counter(a).items() if count > 1]”

:你可能已经明白了,但在Python 3中,使用圆括号调用print函数print()

还要注意,这只适用于列表成员是可哈希的,因为这是集合成员的要求。

使用set()的解决方案不会打印重复项,而是打印唯一元素。

[3,1,2,2,6,3,6]的输入列表,控制台打印3,1,2,6,而不是3,2,6

我注意到在没有库的情况下找到重复元素的代码存在问题。if seen[x] == 1:应该改为if seen[x] >= 1:。当前的代码会忽略第二次出现后的重复项。

:这是有意的,我们希望任何重复项只列出一次。

将您对set()的答案转换为仅获取重复项。seen = set()然后dupe = set(x for x in a if x in seen or seen.add(x))

对于Python 3.x:打印([item for item, count in collections.Counter(a).items() if count > 1])

对于Python 3.7+,我们可以使用字典模拟有序集合,以按输入顺序打印重复项并确保每个重复项只出现一次。

如果一个数字出现多次,但我只想让它出现两次,我该如何做到?例如:从[1, 2, 2, 2, 3, 4, 5, 5, 2, 3, 3]变为[1, 2, 2, 3, 4, 5, 5, 2, 3]

抱歉,如果这个问题很笨,但是你的独特元素正确吗?你遍历所有元素。一开始每个元素都没有被看到,所以它们总是被添加到seen。然后第二次你可能已经看到它,你必须从unique中删除它,以确保它确实是唯一的,否则你的代码只返回元素一次。不?

是否可以将seen = set(); uniq = [x for x in lst if x not in seen and not seen.add(x)] 简化为uniq = list(set(lst))

list(set(lst))会对值进行排序,另一种方法会按照出现的顺序返回唯一值。

0