关于python:如何在列表中打印元素(非重复)

How can I print the elements (non repetitive) in a list

例如:x=[1,1,1,1,2,2,2,"a","a","a","b","b"]

我想打印:1,2,"a","b"

如果列表很长,我甚至不知道列表中有多少种元素呢?

python中有什么函数可以做到这一点吗?或者,如何编写一个for循环来完成它?


只使用集合:

1
2
3
x = [1,1,1,1,2,2,2,"a","a","a","b","b"]
uniques = set(x) # the magic!
print uniques # results: set(['a', 1, 2, 'b'])

当然,如果您想要一个列表对象(谢谢@alfasin):

1
uniques = list(set(x))

一般来说,编程语言将集合表示为一系列独特的元素(尽管我可以看到,在数学中,这似乎不是一个规则)。

  • 设置

相关有用链接:

  • 为什么一个集合不能有两个相同值的元素?
  • 多集
  • 集合


如果要保持元素在原始列表中出现的顺序,请使用itertools库中的groupby

1
2
3
>>> import itertools
>>> [k for k, v in itertools.groupby(x)]
[1, 2, 'a', 'b']

这假设相同的元素已经分组在一起,如您的列表中所示(考虑*nix系统中的uniq实用程序)。


这应该有效:

1
2
3
4
5
6
x = [1,1,1,1,2,2,2,"a","a","a","b","b"]
l = []
for item in x:
  if (item not in l):
    l.append(item)
print(l)


简单的列表理解在时间O(n)中工作,假设在两个具有相同值的元素之间没有包含与这两个元素不同值的元素的子序列。

1
2
3
4
5
6
7
8
9
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]

res = [x[i] for i in range(len(x)) if x[i] != x[i-1]]

#If all the elements of the list have the same value.
if len(res) == 0 and len(x) > 0:
    res.append(x[0])

print res

出:

1
[1, 2, 'a', 'b']

如果记忆是一个问题,那么当你填满另一个时,清空其中一个。

1
2
3
4
your_list = [1,2,1,1,1,1,2,2,2,2,44,4,4,2,2,22,,6,6,5,5,5]
unique_set = set()
while your_list:
    unique_set.add(your_list.pop())

如果只希望每个元素出现一次,例如:

输入:[2,2,1,1,3,3,3,1,1]

输出:[2,1,3]

用途:

1
2
from collections import OrderedDict
answer = OrderedDict(zip(x, xrange(len(x)))).keys()

但如果您希望输出为:[2,1,3,1],请使用ajcr的答案。

如果你不在乎订单,就用费利普斯马丁斯的答案。

说明:有序的听写是字典,所以它们保持键的唯一性。它们也是按顺序排列的,因此键的顺序是插入顺序。

实际上您需要一个set,因为只有键,没有值,但是没有顺序集。因此,zip用于生成元组列表,然后将该列表作为(键、值)对的列表插入到ordereddict中。xrange(len(x))只是生成一个从0len(x)的列表(实际上是一个xrange对象,但这里不相关),但是您可以使用任何长度为len(x)的列表,因为您不关心值。


How can I print the elements (non repetitive) in a list
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]

您要查找的是一个函数,用于获取列表中的唯一元素。一般来说,您需要的是一个set,根据定义,它只包含唯一的元素。

Are there any functions in Python that can do it? Or, how do I write a for loop to do it?

python提供了几种实现这一点的方法,这取决于您的特定需求,其中一种或另一种更合适。以下是几个例子:

1
2
3
4
5
6
7
8
9
10
11
# order and selection don't matter
print set(x)

# preserve item order
print dict(zip(x, x)).keys()

# filter, order not preserved
print set(filter(lambda s : True if isinstance(s, str) else False, x))

# filter, preserve order
print (lambda x : [s for s in dict(zip(x,x)).keys() if isinstance(s, str)])(x)

what if the case is that the list is pretty long and I don't even know how many kinds of elements in the list?

理论上,如果您不知道列表中有什么,那么除了查看每个元素之外,没有其他方法了,如果您想确定的话。

如果您对列表有一些了解,比如说您知道每种元素至少有两个,并且按照您的示例中的顺序,您可以跳过一些元素并至少得到列表的近似值。

如果列表很大,这可能很有趣(尽管我怀疑它有什么实际的区别,因为列表已经在内存中)。举个例子:

1
2
3
4
5
# c is the number of items that at least appear in sequence. here
# we only touch every other element, so we have reduced the number
# of accesses to x by n/2.  
(lambda x, c : set(( x[i] for i in range(0, len(x), c) )))(x, 2)
=> {1, 2, 'a', 'b'}

set确实做到了这一点,尽管它不保留输入列表中显示的顺序。如果要保留此订单,请查看:

1
2
3
4
5
6
def nonRepeats(L):
    answer = []
    for e in L:
        if e not in answer:
            answer.append(e)
    return answer

现在,这将返回一个非重复元素列表,其顺序与它们在L中出现的顺序相同。

但要注意到if e not in answer。该行检查e是否在answer中(这是一个列表)。我们知道列表中的成员资格测试需要O(n)个时间,也就是说,为了确定元素是否存在于列表中,几乎需要测试列表中的所有元素。这会变得相当昂贵,因为在最坏的情况下,answer可能会增长到L的大小,这使得执行该函数时该行花费O(n^2)时间。

因此,我们可以使这个函数运行得更快(用一点空间成本来抵消时间成本):

1
2
3
4
5
6
7
def nonRepeats(L):
    seen = set()
    answer = []
    for e in L:
        if e not in seen:
            answer.append(e)
    return answer

由于seenset,成员资格测试只需要花费o(1),这意味着if e not in seen行需要花费函数o(n)时间。现在,进入太空:这个seen装置可能会增长到L的大小。这意味着您将不需要更多的空间作为输入列表的大小来维护seen(因此,如果您试图在内存有限的某种嵌入式系统中使用它,这可能是一个坏主意)。

注意,由于seen是一个set,它是一个散列表,这个解决方案要求输入列表中的所有元素都是可散列的,这并不总是如此(如果输入列表包含一个列表,这个解决方案在其当前形式中就不可用;但是,整数和字符串是可散列的,所以这对于您的用例来说应该是很好的)


如果打印时元素的顺序无关紧要,请使用集合。

1
2
3
>>> x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
>>> list(set(x))
['a', 1, 2, 'b']

您可以使用for循环:

1
2
3
4
5
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
non_repetitive = []
for item in x:
    if item not in non_repetitive:
        non_repetitive.append(item)

是的,这是一种简单的方法,

1
2
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
print set(x)

但是,您也可以使用for循环和字典来实现相同的输出,方法是遍历列表并记录存在的不同元素的频率。

1
2
3
4
5
dummy_dict = {}
for element in x:
    if not element in dummy_dict:
        dummy_dict[element] = 1
print dummy_dict.keys()

最好使用字典,因为从dict访问值是在o(1)时间或常量时间内完成的。