【问题标题】:Comparing next element in a list Python比较列表Python中的下一个元素
【发布时间】:2022-11-22 22:32:43
【问题描述】:

我试图弄清楚如何确保列表中的连续值不相同。预期输出:[1, 2, 3]实际产量: [1, 1, 3, 3]

我也试过使用next(),但这给了我“列表对象不是迭代器”

这里的最佳做法是什么,我做错了什么?

def unique_in_order(iterable):

    return [x for x in iterable if not iterable[x] == iterable[x+1]]

print(unique_in_order([1,1,2,2,3,3]))

【问题讨论】:

  • for x in iterable这里x是列表中的值而不是索引

标签: python


【解决方案1】:

在没有列表理解的情况下这样做。使用第一个元素创建一个列表并迭代以下对

def unique_in_order(iterable):
    lst = [iterable[0]]
    for x in range(len(iterable) - 1):
        if iterable[x] != iterable[x + 1]:
            lst.append(iterable[x + 1])
    return lst

你也可以使用zip

def unique_in_order(iterable):
    lst = [iterable[0]]
    for x, y in zip(iterable, iterable[1:]):
        if x != y:
            lst.append(y)
    return lst

【讨论】:

    【解决方案2】:

    如果你在没有列表理解的情况下这样做,你可以获得更好的控制流并解决你的问题:

    def unique_in_order(iterable):
        list = []
    
        for index, x in enumerate(iterable):
            if index == len(iterable) -1:
                list.append(x)
            elif iterable[index] != iterable[index+1]:
                list.append(x)
    
        return list
    

    【讨论】:

      【解决方案3】:

      这是使用生成器执行此操作的方法。它假定 None 不是列表中的第一个值。

      def unique(lst):
          prev = None
          for val in lst:
              if val != prev:
                  prev = val
                  yield val
      
      print(list(unique([1,1,2,2,3,3,1,1])))
      

      【讨论】:

      • 您可以使用 prev = object() 作为标记值,​​使它适用于包含列表的可迭代对象(假设某处没有对 __eq__ 的奇怪覆盖)。
      【解决方案4】:

      您可以使用列表理解,但请确保将最后一个元素添加到返回的列表中。

      def unique_in_order(lst):
          return [lst[i] for i in range(len(lst)-1) if lst[i] != lst[i+1]] + [lst[-1]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-17
        • 2014-01-07
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多