2012-07-25 186 views
4

我正在嘗試編寫在Python中導入和導出複數列表的代碼。到目前爲止,我正在嘗試使用csv模塊。我已經使用以下數據導出數據到文件:如何在python中將字符串列表轉換爲複數?

spamWriter = csv.writer(open('data.csv', 'wb') 
spamWriter.writerow(complex_data) 

其中複雜數據是由複合(re,im)函數生成的列表編號。例如:

print complex_data 
[(37470-880j),(35093-791j),(33920-981j),(28579-789j),(48002-574j),(46607-2317j),(42353-1557j),(45166-2520j),(45594-232j),(41149+561j)] 

然後,爲了在以後導入此,我嘗試以下方法:

mycsv = csv.reader(open('data.csv', 'rb')) 
out = list(mycsv) 
print out 
[['(37470-880j)','(35093-791j)','(33920-981j)','(28579-789j)','(48002-574j)','(46607-2317j)','(42353-1557j)','(45166-2520j)','(45594-232j)','(41149+561j)']] 

(注意,這是一個列表的列表,我剛好要使用的只有一行例如。)

我現在需要把它變成複數而不是字符串。我認爲應該有一種方法可以像this question那樣進行映射,但我無法弄清楚如何使其工作。任何幫助,將不勝感激!另外,如果有更簡單的方法導入/導出我不知道的複數值數據,我很樂意完全嘗試其他方法。

回答

7
>>> c = ['(37470-880j)','(35093-791j)','(33920-981j)'] 
>>> map(complex, c) 
[(37470-880j), (35093-791j), (33920-981j)] 
+0

@Martijn彼得斯3分鐘擊敗你,但+1仍然 – inspectorG4dget 2012-07-25 22:06:43

+0

非常好,謝謝! – 2012-07-25 22:09:54

7

字符串只是傳遞給complex()

>>> complex('(37470-880j)') 
(37470-880j) 

int()它需要一個複數的字符串表示並解析這一點。您可以使用map()爲列表這樣做:

map(complex, row) 
1
complex_out = [] 
for row in out: 
    comp_row = [complex(x) for x in row] 
    complex_out.append(comp_row) 
+0

Woops - 錯字。謝謝。 – 2012-07-25 22:03:44

0

CSV文件說:

需要注意的是複數寫出由括號包圍。這可能會導致讀取CSV文件的其他程序出現問題(假設它們完全支持複數)。

這應該將'out'中的元素從字符串類型轉換爲複數,這是給定現有代碼的最簡單解決方案,可以輕鬆處理非複雜條目。

for i,row in enumerate(out): 
     j,entry in enumerate(row): 
      try: 
       out[i][j] = complex(out[i][entry]) 
      except ValueError: 
       # Print here if you want to know something bad happened 
       pass 

否則在每一行上使用map(complex,row)會佔用較少的行。

for i,row in enumerate(out): 
     out[i] = map(complex, row) 
0

我認爲上述每一種方法是有點複雜

最簡便方法是

In [1]: complex_num = '-2+3j' 

In [2]: complex(complex_num) 
Out[2]: (-2+3j) 
相關問題