Python 如果行中有某个值,则添加二维列表的列

Python 如果行中有某个值,则添加二维列表的列,python,Python,假设我有一个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']

假设我有一个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会处理得更好

这可以通过在列表中的每个元素上循环,检查第四个位置的x或y,并添加到一些运行总数中来实现:

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)

这可以通过在列表中的每个元素上循环,检查第四个位置的x或y,并添加到一些运行总数中来实现:

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)

这应该可以,我正在使用

输出将是

[['x', 5], ['y', 11], ['z', 1]]

这应该可以,我正在使用

输出将是

[['x', 5], ['y', 11], ['z', 1]]

您可以使用集合中的计数器:

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]


请注意,for循环的运行速度将比one-liners快

您可以使用集合中的计数器:

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]


请注意,for循环将比one-liners运行得更快,但可以使用另一种方法

从集合导入defaultdict mylist=[ [3,4,5,'x'], [6,1,4,'x'], [4,7,9,'y'], [0,4,3,'y'], [5,1,7,'z'] ] d=默认措辞 对于mylist中的l: d[l[3]]+=l[1] d:defaultdict,{'x':5,'y':11,'z':1} dictd转换为常规dict
还有另一种方法可以使用

从集合导入defaultdict mylist=[ [3,4,5,'x'], [6,1,4,'x'], [4,7,9,'y'], [0,4,3,'y'], [5,1,7,'z'] ] d=默认措辞 对于mylist中的l: d[l[3]]+=l[1] d:defaultdict,{'x':5,'y':11,'z':1} dictd转换为常规dict
出于这个目的,我更喜欢熊猫,比如:

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
与熊猫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}

就这样

出于这个目的,我更喜欢熊猫:

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
与熊猫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}

就是这样

应该是['y',11],因为y出现在两列中,7+4=11,其中7和4是第二个元素。是的,谢谢,我把x错当成了yCool!检查下面我的答案@rharperit应该是['y',11],因为y出现在两列中,7+4=11,其中7和4是第二个元素。是的,谢谢,我把x错当成了yCool!请在下面@rharperDamn检查我的答案!本可以指望在柜台上,却不知道你们可以使用这样的柜台!该死本可以指望在柜台上,却不知道你们可以使用这样的柜台!