Python:将x、y、z数据转换为字典,并使用x、y作为元组键
我对Python知之甚少,我的谷歌技能也让我失望。我已经导入了csv并获得了一个列表,其中包括:Python:将x、y、z数据转换为字典,并使用x、y作为元组键,python,Python,我对Python知之甚少,我的谷歌技能也让我失望。我已经导入了csv并获得了一个列表,其中包括: a = ([x1,y1,z1]...[xn,yn,zn]) 我想要一个字典,其中唯一的x,y组合具有所有的z值。我创建了一个将唯一的x,y值作为元组的列表,但我不知道如何将它们转换为一个字典,其中元组是键,z值为每个键列出。有人有什么建议吗 在这个场景中的具体用途是我有各种各样的x,y坐标,它们都有一个相关的值,最终的目标是为每个x,y坐标找到最高的值,看起来创建字典是正确的方法 例如: 给定 a
a = ([x1,y1,z1]...[xn,yn,zn])
我想要一个字典,其中唯一的x,y
组合具有所有的z
值。我创建了一个将唯一的x,y
值作为元组的列表,但我不知道如何将它们转换为一个字典,其中元组是键,z
值为每个键列出。有人有什么建议吗
在这个场景中的具体用途是我有各种各样的x,y坐标,它们都有一个相关的值,最终的目标是为每个x,y坐标找到最高的值,看起来创建字典是正确的方法
例如:
给定
a=([1,1,10],[1,1,20],[1,1,30],[1,2,10],[1,2,20])
b=dict()
我想制作一本print(b)返回的词典
{(1,1):10,20,30,(1,2):10,20}
再次编辑:
我尝试了下面的方法,它们似乎很有效,但后来我意识到我的.csv的值是作为字符串导入的。我开始四处寻找解决办法,并看到了使用熊猫的建议。30分钟后,我写了一些东西,可以导入,按x,y列排序,然后导出10行中每个列的最大值,所以我从一开始就用一种非常笨拙的方式来处理这个问题。谢谢你的指点:)一个简单的听写理解
{(item[0],item[1]):item[2] for item in a}
简单的听写理解
{(item[0],item[1]):item[2] for item in a}
备选方案1:键作为由其他值组成的单个值
如果可以将键解析为文本,则可以使用由它们组成的单个值作为键:
a = [['a','b','c'],['d', 'e', 'g']]
b = dict()
for entry in a:
b[f"{entry[0]},{entry[1]}"] = entry[2]
print(b)
本例中生成的词典是{'a,b':'c','d,e':'g'}
备选方案2:使用实际元组作为键
如果确实要使用元组(而不是组合的单个值),可以使用:
a = [['a','b','c'],['d', 'e', 'g']]
b = dict()
for entry in a:
b[(entry[0],entry[1])] = entry[2]
print(b)
这将返回以下字典:{('a','b'):'c',('d','e'):'g'}
备选方案1:将键作为由其他值组成的单个值
如果可以将键解析为文本,则可以使用由它们组成的单个值作为键:
a = [['a','b','c'],['d', 'e', 'g']]
b = dict()
for entry in a:
b[f"{entry[0]},{entry[1]}"] = entry[2]
print(b)
本例中生成的词典是{'a,b':'c','d,e':'g'}
备选方案2:使用实际元组作为键
如果确实要使用元组(而不是组合的单个值),可以使用:
a = [['a','b','c'],['d', 'e', 'g']]
b = dict()
for entry in a:
b[(entry[0],entry[1])] = entry[2]
print(b)
这将返回以下字典:
{('a','b'):'c',('d','e'):'g'}
如果您只对最高值感兴趣,请执行以下操作:
b = dict()
for entry in a:
x, y, z = *entry # tuple unpacking
if b.get((x,y), float('-inf')) < z:
b[x,y] = z
print(b)
如果您只对最高值感兴趣,请执行以下操作:
b = dict()
for entry in a:
x, y, z = *entry # tuple unpacking
if b.get((x,y), float('-inf')) < z:
b[x,y] = z
print(b)
这是一种获得指定结果的简单方法:
a = ([1, 1, 10], [1, 1, 20], [1, 1, 30], [1, 2, 10], [1, 2, 20])
b = {}
for [x,y,z] in a:
if (x,y) in b:
b[(x,y)].append(z)
else:
b[(x,y)] = [z]
b == {(1, 1): [10, 20, 30], (1, 2): [10, 20]}
然后,您可以通过以下方式获得最大值:
b_max = {k:max(v) for k,v in b.items()}
或者,您可以立即收集最大值:
b = {}
for [x,y,z] in a:
if (x,y) in b:
if b[(x,y)] < z:
b[(x,y)] = z
else:
b[(x,y)] = z
b={}
对于a中的[x,y,z]:
如果b中的(x,y):
如果b[(x,y)]
不管它值多少钱,这是一种获得指定结果的简单方法:
a = ([1, 1, 10], [1, 1, 20], [1, 1, 30], [1, 2, 10], [1, 2, 20])
b = {}
for [x,y,z] in a:
if (x,y) in b:
b[(x,y)].append(z)
else:
b[(x,y)] = [z]
b == {(1, 1): [10, 20, 30], (1, 2): [10, 20]}
然后,您可以通过以下方式获得最大值:
b_max = {k:max(v) for k,v in b.items()}
或者,您可以立即收集最大值:
b = {}
for [x,y,z] in a:
if (x,y) in b:
if b[(x,y)] < z:
b[(x,y)] = z
else:
b[(x,y)] = z
b={}
对于a中的[x,y,z]:
如果b中的(x,y):
如果b[(x,y)]
使用setdefault
d = {}
for [x, y, z] in a:
d.setdefault((x,y),[]).append(z)
使用setdefault
d = {}
for [x, y, z] in a:
d.setdefault((x,y),[]).append(z)
你能举个小例子(用实际值)说明你拥有什么和你想要什么吗?当然,我会加上它和一些澄清(我不得不出去开会,不得不匆匆离开一会儿)你能举个小例子(用实际值)说明你拥有什么和你想要什么吗?当然,我会加上它和一些澄清(我不得不出去开会,不得不匆匆离开一会儿)不,它们是由另外两个值组成的单个值,如果这两个值都可以解析为字符串,那么它们的工作方式将类似于元组。你真的需要将它们分开吗?我编辑了我的答案,添加了一个使用元组作为键的备选值。只是为了澄清。我没有发布问题。其次,只有当值是strin时,它们才会相同元组中的g(但这是一个错误的假设)这是一个公平的论点,实际上取决于用例。我习惯于把数字看成是数字,我没有考虑把每个唯一的坐标组合转换成一个字符串。如果我这样做,我必须在输出所有东西之前把它转换回来,但是它可以简化整体的事情。不,它们是由两个组成的单个值,如果是BO的话。这些值可以被解析为一个字符串,其工作原理与元组类似。你真的需要将它们分开吗?我编辑了我的答案,以添加一个使用元组作为键的替代项。只是为了澄清。我没有发布这个问题。其次,只有当值是元组中的字符串时才会相同(但这是一个错误的假设)这是一个公平的论点,实际上取决于用例。我习惯于把数字看作是数字,我没有考虑把每个唯一的坐标组合转换成一个字符串。如果我这样做,我必须在输出所有东西之前把它转换回来,但是它可以简化所有的东西。它只存储一个Z值,只存储一个Z。b值