2017-02-28 68 views
0

的名單:的Python:創建字典兩個清單鑑於這種字典元組

d={0: [(78.65, 89.86), 
    (28.0, 23.0), 
    (63.43, 9.29), 
    (66.47, 55.47), 
    (68.0, 4.5), 
    (69.5, 59.0), 
    (86.26, 1.65), 
    (84.2, 56.2), 
    (88.0, 18.53), 
    (111.0, 40.0)], ...} 

如何創建兩個列表,這樣y需要每個元組的第一個元素和x採取第二,爲每個密鑰在d

在上面的例子中(僅key=0所示),這將是:

y=[78.65, 28.0, 63.43, 66.47, 68.0, 69.5, 86.26, 84.2, 88.0, 111.0] 
x=[89.86, 23.0, 9.29, 55.47, 4.5, 59.0, 1.65, 56.2, 18.53, 40.0] 

我的嘗試是錯誤的(我試過x只列出):

for j,v in enumerate(d.values()):  
    x=[v[i[1]] for v in d.values() for i in v] 

因爲:

TypeError         Traceback (most recent call last) 
<ipython-input-97-bdac6878fe6c> in <module>() 
----> 1 x=[v[i[1]] for v in d.values() for i in v] 

TypeError: list indices must be integers, not numpy.float64 

這是怎麼回事?

+2

不知道如果字典包含兩個元素會發生什麼...... –

+0

你是指'key = 1'的另一個元組列表?在這種情況下,並不多,因爲我想在for循環中提取這兩個列表,以便在每次迭代時它們都是不同的。這回答了你的問題了嗎? – FaCoffee

+3

'x = [i [1] for v in d.values()for i in v]'應該適用於您的片段 – schwobaseggl

回答

4

如果我理解您的評論正確的,你想獲得與鍵0相關的元組列表的xy座標。在這種情況下,你可以簡單地使用zip(..)map(..)list S:

y,x = map(list,zip(*d[0])) 

如果你不想改變xy在你的程序後 - 不變的名單基本上tuple S,則可以省略map(list,...)

y,x = zip(*d[0]) # here x and y are tuples (and thus immutable) 

記住,如果字典包含兩個元素,如:

{0:[(1,4),(2,5)], 
1:[(1,3),(0,2)]} 

它會只處理0密鑰的數據。所以y = [1,2]x = [4,5]

+0

是的,我是。這些座標以'(row,column)'的形式返回。 – FaCoffee

+1

或者,在python 3中它會生成迭代器,其中python將解包爲元組。 –

+0

我喜歡這個解決方案,但是如果'y,x = zip(* d [0])'嵌套在for循環中以遍歷所有密鑰?它是否足夠改變它'y,x = zip(* d [i])'? – FaCoffee

2

你的意思是這樣嗎?

z = [i for v in d.values() for i in v] 
x, y = zip(*z) 
+1

爲什麼你要構造一個新的元組並且不自己返回'i'? –

+0

@WillemVanOnsem偉大的一點! –