【问题标题】:How to fill the gaps in a list of tuples如何填补元组列表中的空白
【发布时间】:2020-07-06 02:23:53
【问题描述】:

我有一个元组列表,如下所示:

[(1, 'Red'), (2, 'Yellow'), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]

元组中的数字代表索引。但是,由于我的输入文件中缺少一些索引,我需要在列表中插入一些元组,并使列表如下所示:

[(1, 'Red'), (2, 'Yellow'), (3, None), (4, None), (5, None), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]

如果你们中的一些人有任何想法,如果您花时间发表评论,我将不胜感激。

【问题讨论】:

  • 这看起来不像是有效的 python
  • 你能分享一个有效的名单吗?
  • 更新元组 根据定义是不可能的。 另一方面,将值(可能是元组)插入列表是非常简单的。你这样做有什么问题?
  • 您无法更新元组的值,但如果它们存储在列表或其他可变容器中,您可以替换它们。
  • 到目前为止你尝试过什么?您的列表总是按索引排序吗?您需要修改列表 inlace,还是可以从旧列表创建新列表?

标签: python algorithm indexing tuples


【解决方案1】:

这是一个您可以尝试的简单方法。如果首先获取minmax 数字范围,然后使用设置差异set(A) - set(B) 获取缺失的数字,然后将缺失的数字与原始列表连接并使用sorted() 对结果进行排序。我还添加了 cmets 来解释这种方法 :)

lst = [(1, 'Red'), (2, 'Yellow'), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]

# Get only numbers
active_numbers = [x for x, _ in lst]

# Get min and max ranges
min_number, max_number = min(active_numbers), max(active_numbers)

# Get all possible numbers in range
all_numbers = set(range(min_number, max_number + 1))

# Find missing numbers using set difference set(A) - set(B)
difference = all_numbers - set(active_numbers)

# Add missing numbers and original numbers and sort result
result = list(sorted(lst + [(x, None) for x in difference]))

print(result)

输出:

[(1, 'Red'), (2, 'Yellow'), (3, None), (4, None), (5, None), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]

【讨论】:

    【解决方案2】:

    假设列表已排序或结果不需要保留列表顺序,您可以使用从原始列表创建的dict

    z = [(1, 'Red'), (2, 'Yellow'), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
    d = dict(z)
    low, high = min(d), max(d)
    result = [(i, d.get(i)) for i in range(low, high + 1)]
    

    【讨论】:

      【解决方案3】:

      以下代码对我有用。这是非常幼稚的并且不是特别有效。 min_keymax_key 为您提供键的间隔界限,因此您并不总是从 0 开始。对于该范围内的所有索引,它将设置默认值 None。如果存在值,则不会更改任何内容。

      然后,字典中的项目将根据键值进行排序。

          data = [(1, 'Red'), (2, 'Yellow'), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
          data_as_dict = dict(data)
          max_key = max(data_as_dict.keys())
          min_key = min(data_as_dict.keys())
      
          for i in range(min_key, max_key):
              data_as_dict.setdefault(i, None)
          data_as_dict = sorted(data_as_dict.items(), key=lambda item: item[0])
          print(data_as_dict)
      
      
      [(1, 'Red'), (2, 'Yellow'), (3, None), (4, None), (5, None), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
      

      但是,如果您不介意从索引 0 开始,您可能想看看使用仅包含您的颜色的列表,其中元组的第一个值是列表中的索引,以优化内存足迹。

      希望对你有帮助!

      【讨论】:

        【解决方案4】:

        这是一个简单的一次性方法,可以保持原始顺序:

        out = []
        lasti = 0
        for i, v in data:
            if i - lasti > 1:
                # if not continued, fix the gap
                for j in range(lasti + 1, i):
                    out.append((j, None))
            out.append((i, v)) # add the value
            lasti = i
        print(out)
        

        输出:

        [(1, 'Red'), (2, 'Yellow'), (3, None), (4, None), (5, None), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
        

        【讨论】:

          【解决方案5】:

          我在这里提出最简单的实现,但对于大型列表不是很有效:

          test = [(1, 'color: Red'), (2, 'color: Yellow'), (6, 'color: Pink'), (7, 'color: Blue'), (8, 'color: Green')]
          
          
          max_index = max(test, key=lambda item:item[0])[0]
          
          missing_values = []
          for i in range(1, max_index + 1):
              missing = False
              for index, val in test:
                  if i != index:
                      missing = True
                  else:
                      missing = False
                      break
              if missing:
                  missing_values.append((i,'color: None'))
          
          new_test = test + missing_values
          new_test_sorted = sorted(new_test, key=lambda x:x[0])
          print(new_test_sorted)
          

          这给了:

          [(1, 'color: Red'), (2, 'color: Yellow'), (3, 'color: None'), (4, 'color: None'), (5, 'color: None'), (6, 'color: Pink'), (7, 'color: Blue'), (8, 'color: Green')]
          

          【讨论】:

          • 感谢您的回答。你能告诉我行 list_items = lambda test 发生了什么:test[0]
          • 绝对没有!这是一个错字!我现在将其删除^_^
          猜你喜欢
          • 2022-11-16
          • 1970-01-01
          • 2015-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 2019-02-05
          相关资源
          最近更新 更多