2013-04-24 74 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