例如:x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
我想要打印:1,2,"a","b"
如果案例是列表很长并且我甚至不知道列表中有多少种元素呢?
Python中是否有可以执行此操作的函数?或者,我如何写一个for循环呢?
答案 0 :(得分:7)
只需使用sets:
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):
uniques = list(set(x))
通常编程语言将集合表示为一系列独特元素(虽然我可以看到在数学中这似乎不是一个规则)。
相关有用的链接:
答案 1 :(得分:5)
如果您希望保持元素在原始列表中的显示顺序,请使用groupby
库中的itertools
:
>>> import itertools
>>> [k for k, v in itertools.groupby(x)]
[1, 2, 'a', 'b']
这假设相同的元素已经组合在一起,就像在列表中一样(想想* nix系统中的uniq
实用程序)。
答案 2 :(得分:2)
这应该有效:
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)
答案 3 :(得分:1)
是的,有一种简单的方法可以做到这一点,
x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
print set(x)
但是,你也可以使用for循环和字典来迭代列表并记录各种不同元素的频率来实现相同的输出。
dummy_dict = {}
for element in x:
if not element in dummy_dict:
dummy_dict[element] = 1
print dummy_dict.keys()
使用字典是首选,因为从dict访问值是在O(1)时间或恒定时间内完成的。
答案 4 :(得分:1)
您可以使用for
循环:
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)
答案 5 :(得分:1)
如果打印元素的顺序无关紧要,请使用集合。
>>> x=[1,1,1,1,2,2,2,"a","a","a","b","b"]
>>> list(set(x))
['a', 1, 2, 'b']
答案 6 :(得分:1)
set
正是这样做的,尽管它不保留它在输入列表中的显示顺序。如果您想保留此订单,请查看以下内容:
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)时间。
因此,我们可以让这个功能运行得更快一些(通过以一点空间成本抵消时间成本):
def nonRepeats(L):
seen = set()
answer = []
for e in L:
if e not in seen:
answer.append(e)
return answer
由于seen
是set
,因此成员资格测试只需花费O(1),这意味着if e not in seen
行会花费函数O(n)时间。
现在,在空间上:seen
集可能会增长到L
的大小。这意味着您不需要更多的空间作为输入列表的大小来维护seen
(因此,如果您尝试在某种内存有限的嵌入式系统中使用它,这可能是一个坏主意)。
请注意,由于seen
是一个set
,这是一个哈希表,因此该解决方案要求输入列表中的所有元素都是可清除的,但情况并非总是如此(如果是输入的话) list包含一个列表,这个解决方案在当前形式下变得无法使用;但是,整数和字符串是可清除的,所以这对你的用例来说应该没问题。)
答案 7 :(得分:1)
如何在列表中打印元素(非重复) X = [1,1,1,1,2,2,2, “一”, “一”, “一个”, “B”, “B”]
您正在寻找的是获取列表的唯一元素的功能。一般来说,你想要的是set
,by definition只包含唯一的元素。
Python中是否有可以执行此操作的函数?或者,我如何写一个for循环呢?
Python提供了几种方法来实现这一点,具体取决于您的具体需求,其中一种或另一种更合适。以下是一些例子:
# 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)
如果案例的列表很长,我甚至不知道列表中有多少种元素呢?
理论上,如果你不知道列表中的内容,除了查看每个元素之外别无他法,如果你想确定的话。
如果您对列表有一些了解,请说您知道每种类型至少有两个元素,并且按照示例中的顺序,您可以跳过一些元素并至少得到列表的近似值。
如果列表很大,这可能会很有趣(尽管我怀疑它有什么不同,因为列表已经在内存中)。举个例子:
# 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'}
答案 8 :(得分:1)
如果您只希望每个元素出现一次,例如:
输入:[2,2,1,1,3,3,3,1,1]
输出:[2,1,3]
使用:
from collections import OrderedDict
answer = OrderedDict(zip(x, xrange(len(x)))).keys()
但如果您希望输出为:[2,1,3,1]
,请使用ajcr的答案。
如果你不关心订单,请使用felipsmartins的答案。
说明:Ordered dicts是字典,因此它们保持密钥唯一。它们也是有序的,因此键的顺序是插入的顺序。
实际上你需要一个set
,因为只有键,没有值,但没有OrderedSet。因此zip
用于生成元组列表,然后将此列表作为(键,值)对列表插入到OrderedDict中。 xrange(len(x))
只是生成一个列表(实际上是一个xrange对象,但在此处不相关),从0
到len(x)
,但您可以使用长度为len(x)
的任何列表相反,因为你不关心价值观。
答案 9 :(得分:1)
如果记忆是一个问题,那么在填充另一个时清空一个。
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())
答案 10 :(得分:1)
简单列表理解在假设下在时间O(n)中起作用,在具有相同值的两个元素之间没有元素的子序列,其包括与这两个元素不同的元素。
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, 2, 'a', 'b']