2013-09-26 63 views
0

背景:
我有一個非常大的3D笛卡爾座標列表,我需要處理這個列表來處理座標的Z座標(即該平面上的所有座標) 。目前,我使用每個Z座標的循環從列表中手動創建組,但如果現在有幾十個可能的Z(以前只處理2-3個平面)座標,則這變得不切實際。我知道如何根據相似的元素對列表進行分組,但是我正在尋找一種方法來自動執行此過程,以獲得n個可能的Z值。

問題:
什麼是自動執行分組列表過程的最有效方法同一個Z座標的元素,然後爲每個平面創建一個唯一列表?最有效的方法來自動化列表條目的分組

代碼段:
我只是用一個簡單的列表理解到組各個平面:
newlist=[x for x in coordinates_xyz if insert_possible_Z in x]
我在尋找它自動進行在每一個Z平面一個新的唯一列表數據集。

數據格式:
((x1,y1,0), (x2, y2, 0), ... (xn, yn, 0), (xn+1,yn+1, 50),(xn+2,yn+2, 50), ... (x2n+1,y2n+1, 100), (x2n+2,y2n+2, 100)...)
我想自動獲得所有座標,其中Z = 0,Z = 50,Z = 100等。注意,Z的值(50單位)僅是一個例子,實際數據可以有任何值。

備註:
我的數據是從文件導入的,或者是由列表中的單獨模塊生成的。這是與另一個程序(我沒有寫過)的接口所必需的。

+0

你可以發佈你的當前代碼嗎?座標如何存儲?列出?字典?元組? –

+0

爲了清晰起見添加了一個片段:) – MarkyD43

+0

Z數據是連續的還是離散的?如果它是連續的,你是否需要將數據分隔預定義的範圍? – Swiftfoottim

回答

0

如果我正確解釋這個,你有一組座標C =(X,Y,Z)和離散數量的Z值。如果是這種情況,爲什麼不使用字典將座標列表和關聯的Z值關聯起來呢?

你的數據結構將類似於:

z_ordered = {} 
z_ordered[3] = [(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)] 

凡與鍵關聯每個列表具有相同的Z值。

當然,如果你的Z值是連續的,則可能需要修改此,通過與一個Z值相關聯的只是整個數字鍵說,讓你在分檔遞增1.

1

通過Z對元素進行分組並將其分組的列表最有效的方法是不要創建列表。

itertools.groupby不需要創建新列表的開銷即可進行分組。

當您不熟悉常規機制時,Python生成器會稍微習慣。 official generator documentation是瞭解他們爲什麼有用的一個很好的起點。

+0

嗨,我正在考慮你的建議,並試圖熟悉使用生成器(閱讀文檔後,我意識到我的代碼有幾個區域更適合使用它們),我只是想知道是否有可能發表一個關於如何最好的使用groupby的簡單例子?我試圖像在文檔中一樣實現它,但它並不像我期望的那樣工作,我非常感謝這個幫助! – MarkyD43

+0

請在問題中添加「未按預期工作」的相關行,或者打開一個新問題。 – msw

0

因此,這是一個簡單的解決方案,我想出了:

groups=[] 
groups[:]=[] 
No_Planes=#Number of planes 
dz=#Z spacing variable here 

for i in range(No_Planes): 
    newlist=[x for x in coordinates_xyz if i*dz in x] 
    groups.append(newlist) 

這讓我處理我的數據與groups[i]簡單的設置中的任何平面。我也可以操縱我的間距。這也是我現有代碼的一個擴展,正如我在閱讀@ msw關於itertools的回覆後意識到的那樣,循環使用我目前的方法將我凝視在臉上,並且比我想象的要簡單得多!

相關問題