【问题标题】:Iterating over a Python 2D list to find the value遍历 Python 2D 列表以查找值
【发布时间】:2015-04-28 11:11:33
【问题描述】:

我正在尝试遍历 Python 2D 列表。当算法遍历列表时,它会将键添加到新列表中,直到检测到新值。然后对列表应用一个操作,然后清空列表,以便再次使用它,如下所示:

original_list = [('4', 'a'), ('3', 'a'), ('2', 'a'), ('1', 'b'), ('6', 'b')]

当original_list被算法读取时,它应该评估每个对象的第二个值,并解密它是否与前一个值不同;如果没有,请将其添加到临时列表中。

这是伪代码

temp_list = []
new_value = original_list[0][1] #find the first value

for key, value in original_list:
    if value != new_value:
        temp_list.append(new_value)

应该输出

temp_list = ['4', '3', '2']

【问题讨论】:

  • 那么你的问题是什么?如果您将预期的输出添加到问题中会更好!
  • This answer explains OrderedDicts for you 如果您更喜欢使用可排序的字典系统。
  • 请注意:将new_value 定义为"a" 将导致第一次迭代对temp_list 执行某些操作,这将是空的。我想这是不可取的。也许添加到比较中:if value != new_value and temp_list:,以确保您不会对空列表进行操作?
  • 似乎有什么问题?
  • 你也可以使用排序的dict-like类型。在 PyPI 和其他地方(blist、SortedCollections、sortedcontainers、rbtree、bintrees、skiplistdict ......)有很多选项可以在您对它们进行变异时保持排序顺序(代价是某些操作需要对数时间而不是线性时间)。

标签: python list loops iteration


【解决方案1】:
temp_list = []
prev_value = original_list[0][1]

for key, value in original_list:
    if value == prev_value:
        temp_list.append(key)
    else:
        do_something(temp_list)
        print temp_list
        temp_list = [key]
    prev_value = value

do_something(temp_list)
print temp_list

# prints ['4', '3', '2']
# prints ['1', '6']

【讨论】:

  • 来自 OP 的问题:“然后将操作应用于列表”......因为我不知道那是什么操作,所以我使用了占位符 => do_something()
【解决方案2】:

不完全确定您在问什么,但我认为 itertools.groupby 可以提供帮助:

>>> from itertools import groupby
>>> original_list = [('4', 'a'), ('3', 'a'), ('2', 'a'), ('1', 'b'), ('6', 'b')]
>>> [(zip(*group)[0], k) for k, group in groupby(original_list, key=lambda x: x[1])]
[(('4', '3', '2'), 'a'), (('1', '6'), 'b')]

这是做什么的:它使用key=lambda x: x[1] 将列表中的项目按其值分组,并使用(zip(*group)[0], k) 获取与一个值相对应的键元组。

【讨论】:

    【解决方案3】:

    如果您的“键”不重复,您可以使用 defaultdict 根据键“排序”值,然后提取您需要的内容

    from collections import defaultdict
    ddict = defaultdict(list)
    for v1, v2 in original_list:
        ddict[v2].append(v1)
    

    ddict 的值现在都是temp_list:

    >>> ddict["a"]
    ['4', '3', '2']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多