簡體   English   中英

Python:非常基礎,無法弄清為什么它沒有拆分為列出的較大數字,而是拆分為單個整數

[英]Python: Very Basic, Can't figure out why it is not splitting into the larger number listed but rather into individual integers

這里的問題很簡單,其他人幫助我解決了另一個問題,但是我無法使他們的任何代碼正常工作,因為我對這里的一些基本知識不了解。

8000.5   16745     0.1257
8001.0   16745     0.1242
8001.5   16745     0.1565
8002.0   16745     0.1595
8002.5   16745     0.1093
8003.0   16745     0.1644

我有這樣的數據文件,當我鍵入

f1 = open(sys.argv[1], 'rt')
for line in f1:
    fields = line.split()
    print list(fields [0])

我得到了輸出

['1', '6', '8', '2', '5', '.', '5']
['1', '6', '8', '2', '6', '.', '0']
['1', '6', '8', '2', '6', '.', '5']
['1', '6', '8', '2', '7', '.', '0']
['1', '6', '8', '2', '7', '.', '5']
['1', '6', '8', '2', '8', '.', '0']
['1', '6', '8', '2', '8', '.', '5']
['1', '6', '8', '2', '9', '.', '0']

而我本來希望從打印列表(字段)之類的試驗中得到類似的東西

[16825.5, 162826.0 ....] 

我在這里想念什么明顯的東西?

謝謝!

刪除list ; .split()已返回列表。

您正在將字段的第一個元素轉換為列表:

>>> fields = ['8000.5', '16745', '0.1257']
>>> fields[0]
'8000.5'
>>> list(fields[0])
['8', '0', '0', '0', '.', '5']

如果希望將第一列作為列表,則可以隨時創建一個列表:

myfirstcolumn = []
for line in f1:
    fields = line.split()
    myfirstcolumn.append(fields[0])

這可以簡化為列表理解:

myfirstcolumn = [line.split()[0] for line in f1]

最后一個命令是問題。

print list(fields[0])從拆分列表中獲取第零個項目,然后將其轉換為列表。

由於您已經有一個字符串列表['8000.5','16745','0.1257'] ,因此第零個項目是一個字符串,當將list()應用到該字符串時,它將轉換為單個元素的list()

您的第一個問題是將list應用於字符串:

list("123") == ["1", "2", "3"]

其次,您在文件中每行print一次,但是您似乎想收集每行的第一項並一次打印全部。

第三,在Python 2中, open調用沒有“ t”模式(默認為文本模式)。

我認為您想要的是:

with open(sys.argv[1], 'r') as f:
    print [ line.split()[0] for line in f ]

問題是您要將正確提取的第一個字段轉換為list

這是打印第一列的解決方案:

with open(sys.argv[1]) as f1:
   first_col = []
   for line in f1:
      fields = line.split()
      first_col.append(fields[0])

   print first_col

給出:

['8000.5', '8001.0', '8001.5', '8002.0', '8002.5', '8003.0']

與其做f1 = open(sys.argv[1], 'rt')不如考慮在完成或發生異常時使用with將關閉文件。 另外,我離開rt因為打開()默認為r EAD和t EXT模式。

最后,也可以使用列表理解來編寫:

with open(sys.argv[1]) as f1:
   first_col = [line.split()[0] for line in f1]

其他人已經很好地回答了這個問題,您看到的行為是因為您在字符串上使用list list將接受您可以迭代的任何對象,並將其變成一個列表-一次一個元素。 除了對象甚至不必具有__iter__方法(字符串就是這種情況)外,這並不令人感到意外-關於__iter__的文章很多,因此我將不再關注該部分。

無論如何,請嘗試以下代碼,然后查看輸出內容:

>>> def enlighten_me(obj):
...     print (list(obj))
...     print (hasattr(obj))
...
>>> enlighten_me("Hello World") 
>>> enlighten_me( (1,2,3,4) )  
>>> enlighten_me( {'red':'wagon',1:5} )

當然,您可以嘗試將示例與集合,列表,生成器一起使用...可以迭代的所有內容。

Levon發表了一個不錯的答案,關於如何在讀取文件時創建列。 我將使用內置的zip函數演示同樣的事情。

rows=[]
for row in myfile:
    rows.append(row.split())

#now rows is stored as [ [col1,col2,...] , [col1,col2,...], ... ]

此時,我們可以通過(Levon的答案)獲得第一列:

column1=[]
for row in rows:
    column1.append(row[0])

或更簡潔地:

column1=[row[0] for row in rows]  #<-- This is called a list comprehension

但是,如果要所有列怎么辦? (如果您不知道有多少列怎么辦?)。 這是zip的工作。

zip將Iterables作為輸入並進行匹配。 換一種說法:

zip(iter1,iter2)

將采用iter1 [0]並將其與iter2 [0]匹配,並將iter1 [1]與iter2 [1]匹配,依此類推-如果考慮一下,它就像是一個拉鏈。 但是,zip不僅可以接受2個參數...

zip(iter1,iter2,iter3) #results in [ [iter1[0],iter2[0],iter3[0]] , [iter1[1],iter2[1],iter3[1]], ... ]

現在,我們需要解決的最后一個難題是使用star運算符解開參數。 如果我有一個功能:

def foo(a,b,c):
    print a
    print b
    print c

我可以這樣調用該函數:

A=[1,2,3]
foo(A[0],A[1],A[2])

或者,我可以這樣稱呼它:

foo(*A)

希望這是有道理的-星號接受列表中的每個元素,然后將其“解包”,然后再傳遞給foo。

因此,將各部分放在一起(記住回到行列表),我們可以解開行列表的包裝並將其傳遞給zip,該zip將與每行(即列)中的相應索引匹配。

columns=zip(*rows)

現在,獲得第一列,我們要做:

columns[0]  #first column

對於列表列表,我想將zip(*list_of_lists)視為一種窮人的轉置。

希望這對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM