2017-04-07 33 views
-1

我有一個關於python的問題。 我有一個功能,需要輸入一組3D點。 通常,如果我這樣做,它工作正常:使用for循環構造列表元組

MyPoints=([0,0,0],[1,1,1],[2,2,2]) 
myfunction(MyPoints) 

的問題是,我想(與for循環即)生成的元組「MyPoints」,「動態」。例如:

MyPoints=([0,0,0]) 
for k in range(1,11) 
    MyPoints=MyPoints+tuple([k,k,k]) 
myfunction(MyPoints) 

問題是,當我調用函數時,上面的代碼向我發送了一個錯誤。它告訴我,我有「太多爭論」。我的問題很簡單:我怎麼構造一個形式的元組: MyPoints =([0,0,0],[1,1,1],[2,2,2],[3 ,3,3])(等)

使用for循環?

非常感謝您的幫助和時間。

編輯: 感謝所有的迴應,但我真的沒有任何工作,但它是我的錯。真對不起。 onlz szntax接受如下:

myfunction(((0,0,0),),((1,1,1),),((2,2,2),),((3,3,3),))) 

有誰知道如何建立這樣的結構使用循環? 再次感謝和抱歉的混亂!

最佳, 朱莉婭

回答

1

您的列表轉換成一個元組時確實要創建一個包含列表中的單元組:

你在做什麼:

>>> tuple([1,1,1]) 
(1, 1, 1) 

你想要什麼:

>>> ([1,1,1],) 
([1, 1, 1],) 

mypoints=([0,0,0],) # notice the , 
... 
mypoints = mypoints + ([k,k,k],) 
+0

你好,也感謝您的答覆!但不幸的是,它也無法正常工作。如果我使用您的解決方案來生成列表,該函數告訴我我有太多的輸入參數。如果我只是做myPoints =([0,0,0],[1,1,1],[2,2,2]),但是該函數接受輸入。它是ABAQUS軟件與Python接口的超級特定功能,所以我不知道這個問題是否來自於此。 –

1

我建議使用列表理解做出點的列表:如果你想把它當作一個元組

myPoints=[((i,i,i),) for i in range(4)] 

myPoints=tuple([((i,i,i),) for i in range(4)]) 
+0

你好,感謝您的回覆!但不幸的是,它不工作。如果我在範圍(4)中使用myPoints = [[i,i,i]],該函數告訴我有太多的輸入參數。如果我只是做myPoints =([0,0,0],[1,1,1],[2,2,2]),但它的工作原理。它是一個超級特定功能(從ABAQUS軟件到與Python的接口) –

+0

您能告訴我只是函數定義嗎?即def myFunc(x,y): –

+0

它可能是該函數解開點的包裝。如果是這種情況,你會在points參數前面看到*。嘗試調用myfunction((MyPoints)) –

1

也許這將有所幫助:

>>> import random 
>>> a = tuple([random.choice([i for i in range(1,11)]) for j in range(3)] for v in range(3)) 
>>> a 
([10, 5, 4], [4, 6, 6], [10, 4, 6]) 
+0

你好,謝謝! Unfortunatelz,至於上面的函數告訴我,當我使用你的方法時,我有太多的輸入參數。我不知道爲什麼... –

+0

請給我你的功能 –

0

有點不相關(摩西的答案在技術上是正確的),但你應該執行lly使用元組列表,而不是列表元組。

元組是一個固定大小的異構集合,其中位置很重要(每個項目的位置都有一個給定的含義)。典型的例子是點(如在你的例子,其中point[0]x協調,point[1]ypoint[2]z),CSV文件或關係數據庫行(一般以及表格數據)等等。實際上,你可以考慮一個元組的字典,其中鍵只是整數...

列表是位置無關的可變大小的同類集合。規範示例將是一組點,一組表格數據(即來自csv文件的所有行或來自關係數據庫查詢的所有行)等。

在您的代碼中,您有「一組3D點」 ,所以「set」=>list'3D point =>tuple

作爲獎勵,建立一個元組列表比建造列表的元組(蟒蛇2.7.6)的方式更快:

[email protected]:~/Work/playground$ cat pointlist.py 
def test1(max=100): 
    points =() 
    for i in xrange(1, max): 
     points += ([i, i, i],) 
    return points 


def test2(max=100): 
    points = [] 
    for i in xrange(1, max): 
     points.append((i, i, i)) 
    return points 

def test3(max=100): 
    points = [(i, i, i) for i in xrange(1, max)] 
    return points 

import timeit 

for i in (1, 2, 3): 
    fun = "test%s" % i 
    print "%s : " % fun 
    print timeit.timeit("fun()", "from __main__ import %s as fun" % fun, number=10000) 
    print 

[email protected]:~/Work/playground$ python pointlist.py 
test1 : 
0.0343580245972 

test2 : 
0.0103368759155 

test3 : 
0.00669503211975