1

在这里非常快速的问题,其他一些人帮助我解决了另一个问题,但我无法让他们的任何代码工作,因为我不了解这里非常基本的东西。

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']

而我本来希望通过试用 print list(fields) 之类的东西来获得类似的东西

[16825.5, 162826.0 ....] 

我在这里缺少什么明显的东西?

谢谢!

4

5 回答 5

7

删除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]
于 2012-05-30T12:48:13.227 回答
6

最后一个命令是问题所在。

print list(fields[0])从拆分列表中获取第零个项目,然后将其转换为列表。

由于您已经有一个字符串列表,因此第零个项目是一个字符串,当应用于它['8000.5','16745','0.1257']时,它会转换为单个元素的列表。list()

于 2012-05-30T12:49:45.763 回答
5

您的第一个问题是您应用于list字符串:

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

其次,您print在文件中的每行一次,但似乎您想收集每行的第一项并一次打印它们。

第三,在 Python 2 中,调用中没有“t”模式open(文本模式是默认模式)。

我想你想要的是:

with open(sys.argv[1], 'r') as f:
    print [ line.split()[0] for line in f ]
于 2012-05-30T12:57:48.613 回答
3

问题是您将正确提取的第一个字段转换为.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')考虑使用withwhich 将在您完成或发生异常时关闭文件。rt另外,由于open()默认为read 和text 模式,因此我离开了。

最后,这也可以使用列表理解来编写:

with open(sys.argv[1]) as f1:
   first_col = [line.split()[0] for line in f1]
于 2012-05-30T12:49:06.877 回答
2

其他人已经很好地回答了这个问题,您看到的行为是因为您在list字符串上使用。 list将获取您可以迭代的任何对象并将其转换为列表 - 一次一个元素。这并不奇怪,只是对象甚至不必有__iter__方法(字符串就是这种情况)——关于 SO 有很多帖子,__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将迭代作为输入并将它们匹配起来。换句话说:

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]], ... ]

现在,我们需要的最后一个难题是使用星号运算符解包参数。如果我有一个功能:

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,它将匹配每行(即列)中的相应索引。

columns=zip(*rows)

现在要获得第一列,我们只需:

columns[0]  #first column

对于列表列表,我喜欢将其zip(*list_of_lists)视为一种穷人的转置。

希望这对您有所帮助。

于 2012-05-30T13:14:48.533 回答