2016-09-16 25 views
-2

我最近开始尝试学习Python,并尝试改进我编写代码的方式,并使其更加“Python化”。 因此,如果有人能向我解释下面是否可以更优雅地制定,那真的会很好。 希望这不是重复的(我检查过,但你永远不知道)忽略特定Python ListElements的优雅方式

我有一个5个元素的列表,我想返回特定的元素。比如说我有[1,2,3,4,4]。 我已经有一个函数double(list),如果列表元素存在两次,则返回该元素(在本例中为3)。

我想从这个列表中产生一个包含仅存在一次(1,2,4)的数字的元组。

一种选择是:

  1. 运行双(单)函数,并且得到是双元素的值。
  2. 创建一个空的元组
  3. 遍历列表中的项目,如果该值不等于双(单)函数返回的东西,把它添加到元组
  4. 返回的元组。

我的问题是:是否有一个更优雅/ Pythonic这样做的方式? (在同一行,用,也许一个更复杂的表达式?)

在此先感谢

+0

,如果你写了一些工作代码,然后把它你可能会得到更好的反应到[codereview.se]。 – jonrsharpe

回答

0

既然你想有一个单行溶液(孔除了课程的实际列表声明:)):

your_list = [1, 2, 3, 3, 4] 

uniques = [item for item in your_list if your_list.count(item) == 1] 
+0

谢谢!这是我正在寻找的。有人还指出我的一个线程,首先将列表转换为一个集合,这应该删除重复的内容。所以现在我已经有了两个选择:-) – eidimon

0

我会用为collections.Counter

>>> import collections 
>>> l = [1, 2, 3, 3, 4] 
>>> c = collections.Counter(l) 
>>> [el for el in l if c[el] == 1] 
[1, 2, 4] 
1

一般的方式做到这一点是让一组然后计算它们,或者只使用collections.Counter,然后遍历列表并仅包含适当的元素,方法是创建一个空列表,然后使用传统循环或通过使用滤波器理解。

>>> import collections 
>>> l = [1, 2, 3, 3, 4] 
>>> c = collections.Counter(l) 
>>> new_list = [item for item in l if c[item] < 2] 
>>> new_list 
[1, 2, 4]