2013-04-24 75 views
1

我有以下列表:使列表座標

Filedata: 
[1, 0, 0, 0] 
[2, 0, 0, 100] 
[3, 0, 0, 200] 
[4, 100, 0, 0] 
[5, 100, 0, 100] 
[6, 100, 0, 200] 
... 

其中第一列是一個ID,第二個是在X座標,所述第三Y座標和第四Z座標。

我想做出不同的X的兩個列表和Y座標原始列表:

X: 
[0, 100, ...] 
Y: 
[0, 100, ...] 

做到這一點,我想到了一個代碼,但在我認識的過程中,必須有一個更簡單爲什麼要這樣做而不是爲循環做多個循環。有任何想法嗎?

+0

'filedata'是一個列表或其他東西? – 2013-04-24 16:50:37

+0

是列表的列表。 – jpcgandre 2013-04-24 16:51:51

回答

4
IDs,Xs,Ys,Zs = zip(*filedata) 
positions = zip(Xs,Ys,Zs) # list of tuples of (x,y,z) 

unique_Xs = [] 
[unique_Xs.append(val) for val in Xs if val not in unique_Xs] 

unique_Ys = [] 
[unique_Ys.append(val) for val in Ys if val not in unique_Ys] 

我想會的工作,假設FILEDATA是一個二維列表,儘管FILEDATA是不是一個偉大的變量名稱...

我加了一個辦法在每個列表中獲得獨特的點...不完全當然,這是你想要的

+0

爲了有X的列表我可以使用:'X =職位[0:]'? – jpcgandre 2013-04-24 17:05:24

+0

否...只需使用'Xs' ....或unique_Xs,如果您只想要唯一點 – 2013-04-24 17:10:08

+0

行!完美的作品!謝謝! – jpcgandre 2013-04-24 17:11:09

2
filedata = [ 
    [1, 0, 0, 0], 
    [2, 0, 0, 100], 
    [3, 0, 0, 200], 
    [4, 100, 0, 0], 
    [5, 100, 0, 100], 
    [6, 100, 0, 200], 
] 

IDs, Xs, Ys, Zs = zip(*filedata) 
Xs, Ys, Zs = set(Xs), set(Ys), set(Zs) 
print 'X:', Xs 
print 'Y:', Ys 
print 'Z:', Zs 
+0

+1將設置的部分添加到它...假設他只想在他的列表中有唯一的點(並且列表順序不重要)...回想一下'set((0,100))== set((100, 0))' – 2013-04-24 17:01:00

+0

@JoranBeasley好點。對我來說'(0,100))!=(100,0)'。但我更喜歡爲X和Y有不同的列表。 – jpcgandre 2013-04-24 17:03:18

+0

@jpcgandre如果你只想得到唯一的結果,但在列表格式和排序,你可以使用列表(排序(集(Xs))) – infrared 2013-04-24 17:05:08

0

看來OP只想要X和Y的列表。他可以這樣做:

xs=zip(*filedata)[1] 
ys=zip(*filedata)[2] 
+0

的答案是的,但只有不同X的列表,Y的 – jpcgandre 2013-04-24 17:07:16

+0

比獲取所有這些列表更昂貴,只使用xs和是的...我刪除了我的反對票(因爲這確實回答了問題)。 ..但這不是一個有效的解決方案 – 2013-04-24 17:09:18

+0

@JoranBeasley你是對的。這是兩次昂貴,我奇怪地overlookeded它。 – Dusk 2013-04-24 17:59:20