【问题标题】:One line coding with if statement inside for loop在 for 循环中使用 if 语句进行一行编码
【发布时间】:2020-12-06 20:26:24
【问题描述】:

我需要帮助将以下代码缩短为一行。

for i in objects:
    if i not in uniq: 
        uniq.append(i)

我只是为了挑战而这样做,而不是保留这个。

【问题讨论】:

  • 你有什么特别的尝试吗?
  • uniq = set(objects) 怎么样?您还没有真正说出代码应该做什么或您拥有的代码有什么问题。

标签: python one-liner


【解决方案1】:

最简单的单行代码是使用set

uniq = set(objects)

如果你真的需要一个列表,你当然可以从集合中创建一个:

uniq = list(set(objects))

【讨论】:

  • 不行,使用 set 会打乱列表的顺序。
  • 如果你想将列表重新排序为第一个列表的“排序”,那么你可以在它上面扔一个sortedsorted(list(set(objects)), key=lambda x: objects.index(x))
【解决方案2】:

您可以使用列表推导,尽管出于多种原因这是一个坏主意

uniq=[]
objects= [9,9,1,2,3,4,5,5,9,9,15,12,33]
[uniq.append(i) for i in objects if i not in uniq]
print(uniq)

输出:

[9, 1, 2, 3, 4, 5, 15, 12, 33]

首先,从样式/可读性的角度来看,它令人困惑,它是“隐式而不是显式”的,它不会为您的 FOR 循环增加任何价值,除非将所有内容放在一行上而没有真正的好处。

其次,它很难修改,它仅限于一个操作,现在可能可以工作,但是如果您需要添加第二个操作,则必须重构整个事情

【讨论】:

【解决方案3】:
objects= [9,9,1,2,3,4,5,5,9,9,15,12,33]    
uniq=[ele for i,ele in enumerate(objects) if objects.index(ele)==i]

输出

[9, 1, 2, 3, 4, 5, 15, 12, 33]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多