Python 如果行中有某个值,则添加二维列表的列
假设我有一个2D列表: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']
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检查我的答案!本可以指望在柜台上,却不知道你们可以使用这样的柜台!该死本可以指望在柜台上,却不知道你们可以使用这样的柜台!