【问题标题】:discover how many lists are inside a value发现一个值中有多少个列表
【发布时间】:2019-06-03 21:14:37
【问题描述】:
my_dict = {"fruits": ["apple", "orange", "grape", "maracuya", "pineapple"],
           "countries": [["India", "China", "Brazil", "Lesotho", "Nepal"], 
                         ["Spain", "Italy", "Japan", "Indonesia", "Russia"], 
                         ["Germany", "Austria", "Paraguay", "New Zealand", "Peru"],
                         ["Australia", "Colombia", "Belice", "Swaziland"]],
           "colors": [["blue", "black", "green", "yellow", "red"],
                      ["purple", "pink", "white", "lila"]]}

有没有办法知道我在每个键下有多少个列表?例如:在关键“水果”下我只有一个,在“国家”下我有 4 个

我尝试过的主要是:

for key, values in my_dict.items():
    print(len(values))

没用

for key in my_dict.values():
   print(len(key))

也失败了

【问题讨论】:

  • 我相信“国家/地区”下有 4 个列表(如果包含外部列表,则为 5 个)。请澄清。另外,你试过什么?
  • 是的,你是对的。在国家的情况下是 4。我已经添加了更多信息:-)

标签: python-3.x dictionary key-value-store


【解决方案1】:

我的第一个问题是您是否也想将水果列表放在另一个列表中。那么所有情况的结构都是相同的,解决方案很简单:

{key: len(value) for key, value in my_dict.items()}

否则,如果您想坚持您发布的数据结构,您可以这样做:

{key: len(value) if isinstance(value[0], list) else 1 for key, value in my_dict.items()}

这将导致:

{'colors': 2, 'countries': 4, 'fruits': 1}

我必须承认,这个解决方案有很多假设。如果您想在任何地方查找所有列表,那将使其变得更加复杂。

【讨论】:

    【解决方案2】:

    一种方法,虽然感觉不是很pythonic,但只是循环遍历值,如果值是列表,则测试列表中的每个项目以查看 it 是否是列出,记录以下内容:

    for key, value in my_dict.items():
        count = 0
        if isinstance(value, list):
            for val in value:
                if isinstance(val, list):
                    count += 1
            print(f'{key} has {count} lists')
    

    打印:

    fruits has 0 list
    countries has 4 lists
    colors has 2 lists
    

    【讨论】:

    • 此解决方案假定嵌套列表将仅包含列表。 {foo:[bar, [baz], [qux]]} 会失败的原因
    • @XeroSmith 是的!更新并适用于您的示例。可能可以做得更优雅,但我觉得这是说明性的。
    • 你有我的支持,你的更新是我或多或少会发布的答案。我相信说明性的答案比聪明的答案更好,尤其是对于初学者而言。现在,如果 OP 想要添加外部列表,他们可以简单地在迭代列表之前在遇到计数器时简单地开始递增计数器。您可能希望将v 更改为if isinstance(v, list) 中的值,以便它在字典迭代开始时与value 匹配。你有我的赞成票
    • @DYZ ooo,嵌套列表的递归解决方案。非常好。
    【解决方案3】:

    非常感谢codingpoets,你的答案是最合适的

    也感谢所有阅读我的问题并试图提供帮助的其他人:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2021-02-16
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多