【问题标题】:trying to write a loop in one line试图在一行中写一个循环
【发布时间】:2013-11-30 16:32:48
【问题描述】:

我正在使用 python 3.3 我一直试图将这一行写在一行中,但我无法管理。

   plop = []
   for i in range (len(list1)):
      if list1[i] != list1[i-1]:
           plop.append(list1[i])

如果需要,我不在乎覆盖 list1,根本不使用“plop”,我也不想使用 set。 谢谢!

p.s 编辑错字了,抱歉

【问题讨论】:

  • 正如@JonClements 指出的那样,您的代码在第一步将list1[0]list1[-1] 进行比较,因此[1,2,1] 将产生[new_ls[1], new_ls[2]]。这是故意的,还是一个错误?

标签: python for-loop python-3.x python-3.3


【解决方案1】:

更具可读性(并且不太容易出现索引错误 - 除非您打算将第一个元素与最后一个元素进行比较,将第二个元素与第一个元素进行比较......)删除连续重复项的方法是如果您只是这样做了:

from itertools import groupby
plop = [k for k, g in groupby(list1)]

当然,你可以“一行”:)

from itertools import groupby; plop = [k for k, g in groupby(list1)]

或者,如果不使用集合,并且不能有任何重复 - 是否连续:

from collections import OrderedDict
plop = list(OrderedDict.fromkeys(list1))

【讨论】:

  • grumble 我正要写OrderedDict 案例,如果元素是可散列的,我会在实践中使用它。您的groupby 解决方案更通用。
  • @DSM 我倾向于保持more_itertools 的最新副本,然后使用unique_everseen 配方而不是OrderedDict 但是是的...关于元素的好点必须是可散列的......而且我想在使用groupby时补充一点是公平的 - 元素必须是可订购的:)
  • 如果没有重复,他似乎是从 another 列表中挑选元素(当然这可能是错字),这就是我走理解路线的原因。如果是错字,是的,最好不要复制内置的内容。
  • @JoachimIsaksson ahhhh.... 非常好的地方 - 那将是完全不同的东西......而且有点奇怪......所以如果澄清一下会很方便:)跨度>
【解决方案2】:

我不确定为什么“单行”要求,但您可以使用理解来做到这一点;

plop = [new_ls[i] for i in range(len(list1)) if list1[i] != list1[i-1]]

...或者如果您不是真的要比较第一个和最后一个元素的第一个值;

plop = [v for (x,y,v) in zip(list1, [None]+list1, new_ls) if x != y]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2016-10-17
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多