Python 如何根据列表中的某个值将列表中的值相加?

Python 如何根据列表中的某个值将列表中的值相加?,python,Python,我有一个列表,每个列表都有以下项目: 地点、计数、时间 样本数据:站点1、15、20 我想找出最好的方法来解决这个问题。我想把每个站点的计数和时间加起来 我想在遍历每个列表时将其转换为字典,但我不确定这会给我带来什么 对于站点、计数、列表中的时间: #创建一个字典,然后呢? 最终的结果是,我想要一个列表或字典(某种我可以使用的数据结构),其中每个站点的计数和时间加在每个站点的“总计”列表中 例: 站点、总计数、总时间 样本数据: site1、50、100#site1的所有数据已相加 s

我有一个列表,每个列表都有以下项目:

地点、计数、时间
样本数据:站点1、15、20
我想找出最好的方法来解决这个问题。我想把每个站点的计数和时间加起来

我想在遍历每个列表时将其转换为字典,但我不确定这会给我带来什么


对于站点、计数、列表中的时间:
#创建一个字典,然后呢?

最终的结果是,我想要一个列表或字典(某种我可以使用的数据结构),其中每个站点的计数和时间加在每个站点的“总计”列表中

例:
站点、总计数、总时间


样本数据:
site1、50、100#site1的所有数据已相加
site2、40、300#site2的所有数据都已添加


不要寻找一个编码的答案,这是完成这项工作的最好方法,也是正确方向上的一点。

你说的是某种数据结构,所以可以从你拥有的列表中构造一个
数据框
,然后使用
groupby
,然后使用
sum
,来得到你想要的

示例

import pandas as pd
data = [['site1',15,20],['site1',35,80],['site2',15,20]]
df = pd.DataFrame(data,columns=['site','time','count'])
print(df.groupby('site').sum())
data = [['site1',15,20],['site1',35,80],['site2',15,20]]
data_d = {}
for rec in data:
    if rec[0] in data_d:
        data_d[rec[0]][0] += rec[1]
        data_d[rec[0]][1] += rec[2]
    else:
        data_d[rec[0]] = rec[1:]
输出

       time  count
site              
site1    50    100
site2    15     20
或者

import pandas as pd
data = [['site1',15,20],['site1',35,80],['site2',15,20]]
df = pd.DataFrame(data,columns=['site','time','count'])
print(df.groupby('site').sum())
data = [['site1',15,20],['site1',35,80],['site2',15,20]]
data_d = {}
for rec in data:
    if rec[0] in data_d:
        data_d[rec[0]][0] += rec[1]
        data_d[rec[0]][1] += rec[2]
    else:
        data_d[rec[0]] = rec[1:]

您可以迭代列表列表(最好改为元组列表),并将计数和时间添加到输出dict中的总计数和总时间中,并将site作为键:

lists = [
    ('site1', 15, 20),
    ('site2', 10, 30),
    ('site1', 5, 25),
    ('site1', 30, 55),
    ('site2', 30, 270)
]
result = {}
for site, count, time in lists:
    total_count, total_time = result.get(site, (0, 0))
    result[site] = (total_count + count, total_time + time)
结果
变成:

{'site1': (50, 100), 'site2': (40, 300)}

这个问题仍然有点模棱两可,但是,例如,您可以构建一个使用字典字典的类。它可以通过如下方式向其中添加数据,以迭代方式聚合数据:

>>> class SiteAggregator:
...     def __init__(self):
...             self.sites = {}
...     def __call__(self, data):
...             site_name, site_counts, site_time = data
...             if site_name not in self.sites:
...                     self.sites[site_name] = {'counts':0, 'time':0}
...             self.sites[site_name]['counts'] += site_counts
...             self.sites[site_name]['time'] += site_time
...
>>> site_agg = SiteAggregator()
>>> site_agg(['a', 20, 22])
>>> site_agg(['b', 10, 13])
>>> site_agg.sites['a']
{'counts': 20, 'time': 22}
>>> site_agg(['a', 10, 12])
>>> site_agg.sites['a']
{'counts': 30, 'time': 34}
>>> sites = [['a', 20, 10], ['b', 30, 15], ['c', 18, 22], ['a', 15, 22], ['b', 10, 2]]
>>> for site in sites:
...     site_agg(site)
...
>>> site_agg.sites['a']
{'counts': 65, 'time': 66}

我认为,以下是解决这个问题的正确方法

import json # For pretty priting dictionary

# List of lists where each sub list contains site, count, time in order
data_list = [
    ["mysite1.com", 11, 88],
    ["mysite1.com", 7, 6],
    ["google.com", 6, 23],
    ["mysite2.com", 9, 12],
    ["google.com", 4, 7],
    ['mysite1.com', 9, 12],
    ['mysite2.com', 13, 4]
];

d = {}

for l in data_list:
    site, count, time = l # Unpacking

    if site in d:
        # APPEND/UPDATE VALUES
        d[site]["count"].append(count)
        d[site]["time"].append(time)
    else:
        # CREATE NEW KEYS WITH DATA
        d[site] = {
            "count": [count],
            "time": [time]
        }

    d[site]["total_count"] = sum(d[site]["count"])
    d[site]["total_time"] = sum(d[site]["time"])

print(json.dumps(d, indent=4))

# {
#     "mysite1.com": {
#         "count": [
#             11,
#             7,
#             9
#         ],
#         "time": [
#             88,
#             6,
#             12
#         ],
#         "total_count": 27,
#         "total_time": 106
#     },
#     "google.com": {
#         "count": [
#             6,
#             4
#         ],
#         "time": [
#             23,
#             7
#         ],
#         "total_count": 10,
#         "total_time": 30
#     },
#     "mysite2.com": {
#         "count": [
#             9,
#             13
#         ],
#         "time": [
#             12,
#             4
#         ],
#         "total_count": 22,
#         "total_time": 16
#     }
# }

这是一个老套的方法(受电气工程启发):使用一个数值为复数的计数器;实部是时间,虚部是计数

这个问题很含糊。您是要迭代每个站点并报告其计数和时间,还是要所有站点的总计数和所有站点的总时间?需要更多的信息。如果您能提供一些示例数据,将有助于添加更多信息。最后,我将对每个站点进行迭代,并对数据进行处理。我需要一个总计数和总时间为每个网站。这是一个单一的名单?或者列表这是我的答案,因为我认为它在这种情况下很有效。其他答案对我来说很好。谢谢