【问题标题】:iterating through a list consisting of nested tuples/dictionaries遍历由嵌套元组/字典组成的列表
【发布时间】:2016-06-12 14:24:41
【问题描述】:

我有以下包含嵌套元组/字典的列表。

list1 = [ 
            ('key1', {'count': 10, 'value1': Counter({'set1': 5, 'set2': 4, 'set3': 1})}), 
            ('key2', {'count': 8, 'value1': Counter({'set1': 6, 'set2': 2})}),
            ('key3', {'count': 7, 'value1': Counter({'set1': 5, 'set2': 2, 'set3': 1})}) 
        ]

这是我目前所拥有的;

for key, value in list1:
    print key, value['count'], '|||', value['value1'].keys(), value['value1'].values()

Result:
key1  10 ||| ['set1', 'set2', 'set3'] [5, 4, 1]
key2  8  ||| ['set1', 'set2'] [6, 2]
key3  7  ||| ['set1', 'set2', 'set3'] [5, 2, 1]

我想不通的是如何让它遍历每个集合并像这样打印它的计数;

key1  10 ||| set1 5, set 4, set3 1
key2  8  ||| set1 6, set2 2
key3  7  ||| set1 5, set2 2, set3 1

对于 Counter 值,我似乎只能获取键或值,但不能一次遍历它们,如上所示。

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    Counter 对象只是具有额外行为的字典,因此您也可以使用dict.items()。但是,我会在这里使用 Counter 对象独有的不同方法。

    循环 Counter.most_common() method 并将生成的元组格式化为字符串:

    for key, value in list1:
        print key, value['count'], '|||', ', '.join(['%s %d' % kv for kv in value['value1'].most_common()])
    

    您可能希望使用带有str.format() 的字符串格式来创建列格式:

    for key, value in list1:
        print '{}  {:<2d} ||| {}'.format(
            key, value['count'],
            ', '.join(['%s %d' % kv for kv in value['value1'].most_common()]))
    

    Counter.most_common() 按从高到低的顺序生成键值对。

    后者的演示:

    >>> for key, value in list1:
    ...     print '{}  {:<2d} ||| {}'.format(
    ...         key, value['count'],
    ...         ', '.join(['%s %d' % kv for kv in value['value1'].most_common()]))
    ...
    key1  10 ||| set1 5, set2 4, set3 1
    key2  8  ||| set1 6, set2 2
    key3  7  ||| set1 5, set2 2, set3 1
    

    【讨论】:

    • 非常感谢,正是我想要的。没想到 Counter most_common() 函数也可以用在那里,非常有用。
    • 嘿,如果有机会救我创建一个新问题,你知道我如何能够用 .format 格式化它吗?我试过'{1} {0}'.format(*(kv for kv in value['value1'].most_common()))。它不起作用,但是当我执行for kv in value['value1'].most_common(): print "{1} {0}".format(*kv) 时,它会起作用。原因是我想更改 %s 和 %d 的顺序。
    • @user1165419:您的字符串格式中只有两个插槽,但正试图传入一个对列表。那是行不通的。您需要格式化单个对,然后用逗号连接结果:', '.join(['{1:d} {0}'.format(*kv) for kv in value['value1'].most_common()])
    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 2020-11-13
    • 2012-07-09
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多