簡體   English   中英

Python:使用x,y作為元組鍵將x,y,z數據轉換為字典

[英]Python: convert x,y,z data to dictionary with x,y as tuple keys

我對Python知之甚少,而我的Google技能使我失望。 我已經導入了一個csv並獲得了我有的列表:

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}

備選方案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)

如果您想擁有所有值(警告:可能會占用空間,並且如果您再次遍歷所有z值並進行比較則可能會比較耗時)

b = dict()

for entry in a:
    x, y, z = *entry # tuple unpacking
    b.get((x,y), []).append(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 

使用setdefault

d = {}
for [x, y, z] in a:
 d.setdefault((x,y),[]).append(z)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM