Python:非常基础,可以';I don’我不明白为什么它不是拆分成所列的较大数字,而是拆分成单个整数
这里有一个很快的问题,其他一些人在另一个问题上帮助了我,但我无法让他们的任何代码正常工作,因为我不理解这里一些非常基本的东西Python:非常基础,可以';I don’我不明白为什么它不是拆分成所列的较大数字,而是拆分成单个整数,python,Python,这里有一个很快的问题,其他一些人在另一个问题上帮助了我,但我无法让他们的任何代码正常工作,因为我不理解这里一些非常基本的东西 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
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 ....]
我错过了什么明显的东西
谢谢 删除
列表
.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]
删除
列表
.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]
问题是您正在将正确提取的第一个字段转换为
列表
以下是打印第一列的解决方案:
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=打开(sys .ARGV(1),“RT”)< /C> >考虑使用<>代码> >在完成或例外情况下关闭文件。另外,由于默认设置为r
ead和t
ext模式,因此我停止了rt
最后,也可以使用以下方法编写:
问题是您正在将正确提取的第一个字段转换为
列表
以下是打印第一列的解决方案:
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=打开(sys .ARGV(1),“RT”)< /C> >考虑使用<>代码> >在完成或例外情况下关闭文件。另外,由于默认设置为r
ead和t
ext模式,因此我停止了rt
最后,也可以使用以下方法编写:
最后一个命令就是问题所在
打印列表(字段[0])
从拆分列表中提取第0项,然后将其转换为列表
由于您已经有了一个字符串列表,
['8000.5'、'16745'、'0.1257']
,所以第0项是一个字符串,当对其应用list()
时,它将转换为单个元素的列表。最后一个命令就是问题所在
打印列表(字段[0])
从拆分列表中提取第0项,然后将其转换为列表
由于您已经有了一个字符串列表,
['8000.5'、'16745'、'0.1257']
,所以第0项是一个字符串,当对其应用list()
时,它将转换为单个元素的列表。您的第一个问题是对字符串应用list
:
list("123") == ["1", "2", "3"]
其次,在文件中每行打印一次,但似乎要收集每行的第一项并一次性打印
第三,在Python 2中,对open
的调用中没有“t”模式(默认为文本模式)
我想你想要的是:
with open(sys.argv[1], 'r') as f:
print [ line.split()[0] for line in f ]
第一个问题是对字符串应用
list
:
list("123") == ["1", "2", "3"]
其次,在文件中每行打印一次,但似乎要收集每行的第一项并一次性打印
第三,在Python 2中,对open
的调用中没有“t”模式(默认为文本模式)
我想你想要的是:
with open(sys.argv[1], 'r') as f:
print [ line.split()[0] for line in f ]
其他人已经很好地回答了这个问题,你看到的行为是因为你在字符串上使用
list
<代码>列表将获取您可以迭代的任何对象,并将其转换为列表--一次一个元素。这并不奇怪,除了对象甚至不需要有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法(字符串就是这种情况)——关于\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在任何情况下,请尝试以下代码并查看它打印出的内容:
>>> 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=[row[0] for row in rows] #<-- This is called a list comprehension
将iter1[0]与iter2[0]相匹配,并将iter1[1]与iter2[1]相匹配,诸如此类——如果你仔细想想,有点像拉链。但是,zip可以接受不止两个参数
zip(iter1,iter2,iter3) #results in [ [iter1[0],iter2[0],iter3[0]] , [iter1[1],iter2[1],iter3[1]], ... ]
现在,我们需要的最后一块拼图是用星运算符解包参数。
如果我有一个函数:
def foo(a,b,c):
print a
print b
print c
我可以这样调用该函数:
A=[1,2,3]
foo(A[0],A[1],A[2])
foo(*A)
或者,我可以这样称呼它:
A=[1,2,3]
foo(A[0],A[1],A[2])
foo(*A)
希望这是有意义的——star在将列表中的每个元素传递给foo之前将其“解压缩”
因此,将这些部分放在一起(请记住返回到行列表),我们可以将行列表解包并将其传递给zip,zip将匹配每行(即列)中的相应索引
现在要获得第一列,我们只需执行以下操作:
columns[0] #first column
对于列表列表,我喜欢将zip(*list\u of\u list)
看作是一种穷人的转置
希望这会有所帮助。其他人已经在回答这个问题上做了大量工作,您看到的行为是因为您正在字符串上使用列表<代码>列表
将获取您可以迭代的任何对象,并将其转换为列表--一次一个元素。这并不奇怪,除了对象甚至不必有\uuuuuu iter\uuuuu
方法(这是字符串的情况)——关于\uuuuuuuu iter\uuuuu
有很多帖子,所以我不会