让我说我有一个2D列表:
mylist = [[3,4,5,'x'],
[6,1,4,'x'],
[4,7,9,'y'],
[0,4,3,'y'],
[5,1,7,'z']]
我如何总结第二列,其中第四元素相同(字母)?目前,我已使用以下方法将第四个元素隔离到一个列表中,避免重复:
newlist = list(set([r[3] for r in mylist]))
哪个返回列表['z', 'y', 'x']
我希望使用[['x', a], ['y', b]..]
这样的格式,或者像{'x':a,...}
这样的字典中这样的格式
其中a
是第二列的总和,其中mylist[3]='x'
为4 + 1,而b
相同,但y
为7 +4。因此,此示例将输出[['x', 5], ['y', 11], ['z', 1]]
什么是最好的方法?还是numpy / pandas会更好地处理它?
答案 0 :(得分:4)
这应该做到,我正在使用zip
mylist = [[3,4,5,'x'],
[6,1,4,'x'],
[4,7,9,'y'],
[0,4,3,'y'],
[5,1,7,'z']]
#Zip all elements in the list
res = list(zip(*mylist))
#Zip the second column and character array
arr = list(zip(res[1], res[3]))
#[(4, 'x'), (1, 'x'), (7, 'y'), (4, 'y'), (1, 'z')]
dct = {}
#Calculate the sum
for num, key in arr:
dct.setdefault(key,0)
dct[key]+=num
print(dct)
#{'x': 5, 'y': 11, 'z': 1}
#Convert dict to list
li = []
for k, v in dct.items():
li.append([k,v])
print(li)
输出将为
[['x', 5], ['y', 11], ['z', 1]]
答案 1 :(得分:2)
您可以使用计数器(来自收藏集):
from collections import Counter
result = Counter()
for r in mylist:
result[r[3]] += r[1]
您也可以在一行中完成此操作:
result = Counter( r[3] for r in mylist for _ in range(r[1]) )
或不使用计数器:
result = dict()
for _,value,_,key in map(tuple,mylist): # for r in mylist
result[key] = result.get(key,0) + value # result[r[3]]=result.get(r[3],0)+r[1]
或
result = { r[3]:sum(v[1] for v in mylist if v[3]==r[3]) for r in mylist }
请注意,for循环的运行速度快于一个内衬
答案 2 :(得分:1)
这可以通过以下方法来完成:遍历列表中的每个元素,检查x或y的第4个位置,并添加到一些总计:
mylist = [[3,4,5,'x'],
[6,1,4,'x'],
[4,7,9,'y'],
[0,4,3,'y'],
[5,1,7,'z']]
x_total = 0
y_total = 0
for i in mylist:
if i[3] == "y":
y_total += i[1]
if i[3] == 'x':
x_total += i[1]
print("x: ",x_total)
print("y: ",y_total)
答案 3 :(得分:1)
为此,我确实更喜欢熊猫:
import pandas as pd
mylist = [[3,4,5,'x'],
[6,1,4,'x'],
[4,7,9,'y'],
[0,4,3,'y'],
[5,1,7,'z']]
df = pd.DataFrame(mylist)
这给出了:
print(df)
0 1 2 3
0 3 4 5 x
1 6 1 4 x
2 4 7 9 y
3 0 4 3 y
4 5 1 7 z
与pandas groupby合作:
print(df.groupby(3).sum())
0 1 2
3
x 9 5 9
y 4 11 12
z 5 1 7
print(df.groupby(3).sum()[1].to_dict())
{'x': 5, 'y': 11, 'z': 1}
就这样
答案 4 :(得分:0)
还可以使用defaultdict
。
from collections import defaultdict
mylist = [
[3,4,5,'x'],
[6,1,4,'x'],
[4,7,9,'y'],
[0,4,3,'y'],
[5,1,7,'z']
]
d = defaultdict(int)
for l in mylist:
d[l[3]] += l[1]
# d: defaultdict(<class 'int'>, {'x': 5, 'y': 11, 'z': 1})
# dict(d) to convert to regular dict