【问题标题】:finding all iterations of an element in a tuple and returning its pair查找元组中元素的所有迭代并返回其对
【发布时间】:2016-03-29 04:08:58
【问题描述】:

所以我有一个看起来像这样的元组列表:

visits_country = (['123', 'United States'], ['456', 'United States'], ['1', 'Canada'], ['24', 'Canada'], ['12', 'Mexico'])

我已经成功地总结了所有第一个条目,其中有第二个条目“美国”如下

us_visits = [x[0] for x in visits_country if x[1] == 'United States']
total_us_visits = sum(map(int, us_visits))

有没有办法自动完成这项任务,这样我就不必为每个国家写一个全新的行来汇总所有配对整数?可能是一个函数,它将返回一个列表,其中包含每个唯一国家/地区及其在原始列表中每次出现的总访问量 (visits_country)?

谢谢!

【问题讨论】:

    标签: python list python-2.7 tuples element


    【解决方案1】:

    简单:

    visits_country = (['123', 'United States'], ['456', 'United States'], 
                      ['1', 'Canada'], ['24', 'Canada'], ['12', 'Mexico'])
    
    dictionary = {}
    
    for count, country in visits_country:
        dictionary[country] = dictionary.get(country, 0) + int(count)
    
    print dictionary
    

    【讨论】:

    • 返回 'Country' 列表: [1, 2, 3] 。如何修改它以使其返回列表“国家”:[sum(1, 2, 3)]?谢谢!!
    【解决方案2】:

    是的。最明显的方法是使用collections.Counteritertools.groupby,后者需要预分类。例如:

    from itertools import groupby
    from operator import itemgetter
    
    visits_country.sort(itemgetter(1))
    sums = [(sum(int(x) for _, x in grp), key)
            for key, grp in groupby(visits_country, itemgetter(1))]
    

    或:

    from collections import Counter
    
    counts = Counter()
    for visits, country in visits_country:
        counts[country] += int(visits)
    

    【讨论】:

    • 如果我们有标准工具,为什么还要使用 import?
    • @Siddhant 你在开玩笑吗?简单的工具?任务有什么困难?只需两行代码即可完成一项简单的任务(如果我们将使用字典生成器,也许可以完成)
    • @JRazor:因为像Counter(或defaultdict(int))这样的东西可以让你简化从counts[country] = counts.get(country, 0) + int(visits)counts[country] += int(visits)的实际使用,Counter有许多额外的实用方法来获取最常见的物品。因为groupby 在输入已经排序的情况下效率更高。因为拥有内置库的全部意义在于将更多的实现推送到通用代码中,所以我们不是手动编写它吗?这些不是晦涩难懂的第三方包,它们是标准的 Python 模块。
    • 事实上,在这种情况下,groupby 的情况实际上不需要预排序(假设示例数据实际上按给定的顺序排列,同一国家/地区的所有数据都分组) ,因此删除 sort 仍然会使 groupby 保持同样的效率并保留原始顺序。
    • Python 词典提供了充足的机会与他合作。我认为不值得为这么简单的任务导入这些东西。
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2020-12-11
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多