Извлечение столбца из табличных данных

#python #python-3.x #file

#python #python-3.x #файл

Вопрос:

Моя задача — извлечь столбец из таблицы и записать его длину len () . Но мой код выделяет его в столбец, поэтому len () подсчитывает каждый элемент столбца отдельно, а не их общее количество

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

water.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
 

Комментарии:

1. покажите, что такое water

2. @Tom Wojcik извините, отредактировано

3. что такое map(str,...) for? str.split() элементы уже str есть?

4. @Xtrem532 вы правы, изменились. Но как это помогает?

5. Более простой код легче читать. У вас есть более длинный пример для water.txt ? Я не понимаю, как длина столбца может отличаться от количества строк.

Ответ №1:

Вы неправильно извлекаете столбец. Правильный способ — понимание списка:

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

С вашими примерами данных я получаю ['H', 'H', 'O'] для el, который является третьим столбцом.

Комментарии:

1. это работает, но только с первым столбцом. Когда я пытаюсь поместить 1 или более: line 3, in <listcomp> el = [line.split()[1] for line in water2] IndexError: list index out of range

2. Очень краткое решение. A 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.126nHETATM    2  H   HOH A   1      27.109  35.124  57.944nHETATM    3  O   HOH A   1      27.486  35.958  57.542n"
        
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)    
 

вывод — это список, представляющий ваш 2-й столбец

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

Поскольку Python используется со многими пакетами, которые многое делают в одной строке, а также из-за двойного ввода, более важно, чем в других языках, всегда знать, каков результат вашей последней строки, как по типу, так и по смыслу.

В будущем вы, вероятно, будете использовать numpy или pandas читать табличные данные в одной строке. Но понять эту единственную строку иногда бывает сложно. Это также трудно запомнить. Выполнение этого самостоятельно в низкоуровневом коде, как показано выше, поможет вам оставаться на связи с вашим кодом. Это также поможет вам прочитать, как другие люди реализовали функции более высокого уровня.