#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
читать табличные данные в одной строке. Но понять эту единственную строку иногда бывает сложно. Это также трудно запомнить. Выполнение этого самостоятельно в низкоуровневом коде, как показано выше, поможет вам оставаться на связи с вашим кодом. Это также поможет вам прочитать, как другие люди реализовали функции более высокого уровня.