我有一个代码列表的小代码,只输出列表中唯一的项目。
这是我的代码
def only_once(a):
return [x for x in a if a.count(x) is 1]
我的老师要求我们为这个功能使用套装。 有人能告诉我我能做什么吗?
我的代码必须输入a = [1,4,6,7,3,2,4,5,7,5,6],输出[1,3,2]。必须保留它的顺序。
答案 0 :(得分:3)
为了澄清,你想要的是一组只出现一次的项目。
这里最好的选择是使用collections.Counter()
,因为这意味着您只计算一次项目,而不是每项计算一次,大大提高了性能:
>>> import collections
>>> {key for key, count in collections.Counter(a).items() if count == 1}
{1, 2, 3}
我们只需用花括号替换方括号,以表示对列表理解的集合理解,以获得一组结果。
答案 1 :(得分:3)
如果您需要多次删除列表中的任何项目,而不是仅在第一次出现后删除,您可以使用:
# without using generators / comprehensions
def only_once(iterable):
seen = set()
duplicates = set()
for item in iterable:
if item in seen:
duplicates.add(item)
seen.add(item)
result = []
for item in iterable:
if item not in duplicates:
result.append(item)
return result
对于一般订单保留重复消除,请参阅itertools recipes中的unique_everseen
:
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D
seen = set()
seen_add = seen.add
if key is None:
for element in ifilterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
yield element
答案 2 :(得分:3)
[我假设您也是用户1744238和用户1744316 - 请选择一个用户名并坚持使用,这样就可以更轻松地查看您问过的问题的哪些变体以及您已经问过什么试过。]
一种基于集合的方法是使用两组作为计数器。你只关心你曾经看过一次或多次。例如,这是一个易于解释的方法:
once
和more
设置一个空集。 once
。 once
中删除,然后将其添加到more
。 once
集合中看到过一次的元素。 once
集中删除,这样就不会输出相同的元素两次。 / LI>
醇>
这给了我:
In [49]: f([1,4,6,7,3,2,4,5,7,5,6])
Out[49]: [1, 3, 2]