【问题标题】:Extract column from tabular data从表格数据中提取列
【发布时间】:2020-12-16 09:52:13
【问题描述】:

我的任务是从表格中拉出一列并写下它的长度len ()。但是我的代码将其发送到一列中,这就是为什么len () 分别计算列的每个元素,而不是它们的总数

water = water.readlines()
for col in water:
    el = list(col.split()[2])

水.txt:

     HETATM    1  H   HOH A   1      27.265  36.739  58.126
     HETATM    2  H   HOH A   1      27.109  35.124  57.944                          
     HETATM    3  O   HOH A   1      27.486  35.958  57.542
...
     HETATM 9999  O   HOH A3333      30.490  83.899  10.929

所需的中间输出:

H
H
O
H
H
O

【问题讨论】:

  • 显示什么是water
  • @Tom Wojcik 抱歉,已编辑
  • map(str,...) 是干什么用的? str.split() 元素已经是 str?
  • @Xtrem532 你是对的,改变了。但这有什么帮助呢?
  • 更简单的代码更容易阅读。 water.txt 有更长的例子吗?我看不出列长与行数有何不同。

标签: python python-3.x file


【解决方案1】:

您没有正确提取列。正确的方法是使用列表理解:

with open(...) as water:
    el = [line.split()[2] for line in water]

根据你的样本数据,我得到['H', 'H', 'O'] el,这是第三列。

【讨论】:

  • 这有效,但仅适用于第一列。当我尝试放置 1 个或多个时:line 3, in <listcomp> el = [line.split()[1] for line in water2] IndexError: list index out of range
  • 非常简洁的解决方案。 list comprehension 是一个快捷方式,建议新用户在更传统的代码中逐步实现,因为它隐藏了他/她应该理解的想法。
【解决方案2】:

将来您可能会使用其他方式以表格形式导入数据。但这是一项重要的练习,因为以下内容适用于您将面临的大多数问题。 The most important initial concept is to use plenty of print statements to understand what each step does.

file = "HETATM    1  H   HOH A   1      27.265  36.739  58.126\nHETATM    2  H   HOH A   1      27.109  35.124  57.944\nHETATM    3  O   HOH A   1      27.486  35.958  57.542\n"
        
lines=file.split('\n')
print(lines)

输出是一个字符串列表:

['HETATM    1  H   HOH A   1      27.265  36.739  58.126',
 'HETATM    2  H   HOH A   1      27.109  35.124  57.944',
 'HETATM    3  O   HOH A   1      27.486  35.958  57.542',
 '']

现在每一行还是一个字符串,所以你需要把它变成一个列表 例如:

a=lines[2].split()
print(a)

输出是一个字符串列表,每个字符串对应这一特定行/行的一列值:

['HETATM', '3', 'O', 'HOH', 'A', '1', '27.486', '35.958', '57.542']

对每一行都这样做并保留第 3 列(索引 2):

col2=[]  # make an empty list to hold the column

for l in lines:
    if len(l)>1:      # leaves empty lines, also at end of file 
        cols=l.split()
        col2.append(cols[2])


print(col2)    

输出是代表您的第二列的列表

['H', 'H', 'O']

因为 Python 与许多在一行中执行很多操作的包一起使用,并且还因为鸭式打字,所以始终知道最后一行的结果是什么比其他语言更重要,无论是类型和意义。

将来您可能会使用numpypandas 在一行中读取表格数据。但有时很难理解单行。也很难记住。如上所示,在低级代码中自己进行操作将帮助您与代码保持联系。它还将帮助您了解其他人如何实现更高级别的功能。

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2021-03-22
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多