How can I print the elements (non repetitive) in a list
例如:
我想打印:
如果列表很长,我甚至不知道列表中有多少种元素呢?
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)) |
一般来说,编程语言将集合表示为一系列独特的元素(尽管我可以看到,在数学中,这似乎不是一个规则)。
- 设置
相关有用链接:
- 为什么一个集合不能有两个相同值的元素?
- 多集
- 集合
如果要保持元素在原始列表中出现的顺序,请使用
1 2 3 | >>> import itertools >>> [k for k, v in itertools.groupby(x)] [1, 2, 'a', 'b'] |
这假设相同的元素已经分组在一起,如您的列表中所示(考虑*nix系统中的
这应该有效:
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()) |
如果只希望每个元素出现一次,例如:
输入:
输出:
用途:
1 2 | from collections import OrderedDict answer = OrderedDict(zip(x, xrange(len(x)))).keys() |
但如果您希望输出为:
如果你不在乎订单,就用费利普斯马丁斯的答案。
说明:有序的听写是字典,所以它们保持键的唯一性。它们也是按顺序排列的,因此键的顺序是插入顺序。
实际上您需要一个
How can I print the elements (non repetitive) in a list
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
您要查找的是一个函数,用于获取列表中的唯一元素。一般来说,您需要的是一个
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'} |
1 2 3 4 5 6 | def nonRepeats(L): answer = [] for e in L: if e not in answer: answer.append(e) return answer |
现在,这将返回一个非重复元素列表,其顺序与它们在
但要注意到
因此,我们可以使这个函数运行得更快(用一点空间成本来抵消时间成本):
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 |
由于
注意,由于
如果打印时元素的顺序无关紧要,请使用集合。
1 2 3 | >>> x=[1,1,1,1,2,2,2,"a","a","a","b","b"] >>> list(set(x)) ['a', 1, 2, 'b'] |
您可以使用
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)时间或常量时间内完成的。