【问题标题】:How to filter list values from corresponding index names located in list?如何从位于列表中的相应索引名称中过滤列表值?
【发布时间】:2020-04-01 04:54:06
【问题描述】:

我有一个小问题,看起来是这样,但我看不到最简单的解决方案。我有一个列表列表:

Example_list=[[['MAX_BID', '€9'], ['BID_NUMBER', 10], ['DATE', '2017-01-25 20:10:33 UTC'], ['SHIPPING_COST', '17.90']], 
[['MAX_BID', '€165'], ['BID_NUMBER', 30], ['DATE', '2017-01-25 20:12:01 UTC'], ['SHIPPING_COST', '16.00']]]

现在我只想过滤第二个列表中 BID_NUMBER 的值。显然以下工作:

>>> print(test[1][1][1])
30

不幸的是,这不是一个解决方案,因为真实案例的列表大小不一,导致所需列表值的位置不同。

我也尝试了以下方法,但它似乎不是最简单的解决方案:

for i in test[1]:
    for p in i:
        if "BID_NUMBER" in p:
            print(p[1])
30

有没有更优雅的解决方案?

【问题讨论】:

  • 第一个列表有3个级别对吗?

标签: python list filtering


【解决方案1】:

如果每个直接子列表中的所有子列表都是键值对,则可以在访问 BID_NUMBER 作为键之前将封闭列表转换为字典:

for d in map(dict, test):
    print(d['BID_NUMBER'])

否则,如果此类密钥对子列表的深度不一致,您可以在尝试转换子-在try 块中列出:

for l in test:
    while True:
        try:
            d = dict(l)
            break
        except ValueError:
            l = l[0]
    print(d['BID_NUMBER'])

【讨论】:

  • 感谢您的评论,目前这会导致以下错误: ValueError: dictionary update sequence element #0 has length 4; 2 是必需的
  • 我明白了。因此,您输入中的子列表确实具有不一致的深度。您应该尝试修复产生此类不良数据的任何逻辑,或者如果您没有权限,则可以在我更新的答案中使用其他解决方案。
  • 感谢您的额外解释,您解释了如何处理不一致的子列表!像魅力一样工作。
  • 用例示例中出现括号错误,导致深度不一致。真实案例数据没有不一致的深度,您的第一个解决方案有效。我已经编辑了顶部帖子,现在您的原始解决方案也可以作为一种魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多