[英]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.