Python: список проблем - PullRequest
       4

Python: список проблем

0 голосов
/ 15 декабря 2009

Я прочитал в текстовом файле и преобразовал каждую строку в список.

используя этот скрипт:

l = [s.strip().split() for s in open("cluster2.wcnf").readlines()]

Как мне поступить:

  1. файл, который он открывает, скорее динамический, чем статический? то есть пользователь выбирает файл для открытия.
  2. Выбор определенных строк для чтения после преобразования в список.
  3. назначать объекты значениям в списке
  4. выбрать первое, последнее или количество значений в каждой строке?

заранее спасибо

Ответы [ 5 ]

1 голос
/ 15 декабря 2009

Прежде всего, вы должны удалить .readlines() из вашего списка понимания.
Во-вторых, l - это список списков, для доступа к первой строке просто выполните: l[0]. Тогда первым элементом первой строки будет l[0][0].

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

0 голосов
/ 15 декабря 2009

То, как вы задаете вопросы, которые вы задаете, показывает мне, что вы не совсем понимаете, что вы хотите, чтобы ваша программа сделала в конечном итоге.

Во-первых, эта строка не просто конвертирует файл в список. Он преобразует его в список кортежей. Каждый кортеж представляет собой набор значений, разделенных пробелом, для одной строки в файле.

Я отвечу на ваши вопросы в том виде, в каком они были даны, но я надеюсь, что некоторые ответы могут еще больше запутать вас.

1 файл, который он открывает, является динамическим, а не статическим? пользователь выбирает файл для открытия.

"cluster2.wcf" не обязательно должно быть строкой. Это может быть переменная. Если вы хотите буквально прочитать ваш вопрос, вот как вы можете изменить код, чтобы сделать это:

filename = raw_input("Which file would you like to read: ")
l = [s.strip().split() for s in open(filename).readlines()]

Здесь стоит отметить. После того, как вы прочитаете файл в список, список будет выглядеть так:

[('This', 'is', 'the', 'first', 'line.'),
 ('This', 'is', 'the', 'second', 'line.'),
 ('And', 'finally', 'the', 'last', 'line.')]

Каждый элемент вашего списка представляет собой дополнительный список всех «слов» в этой строке. Слова, определенные как разделенные пробелами группы символов.


2 Выберите определенные строки для чтения после преобразования в список.

Этот вопрос является запутанным вопросом. Вы уже прочитали файл. Вы хотите прочитать это снова? Я предполагаю, что вы на самом деле имеете в виду: «Как мне работать с определенной строкой файла после того, как я прочитал ее в список?». Я отвечу на этот вопрос.

Каждая строка файла будет соответствовать определенному элементу списка. Доступ к элементам списка осуществляется по номерам, начинающимся с 0. Первая строка вашего файла будет в l[0]. Второй в l[1] и так далее до (и это немного магии Python здесь) l[-1]. Отрицательные индексы в Python считаются в обратном направлении от конца списка.


3 назначать объекты значениям в списке

Это сбивает с толку, потому что вы не указываете, какие объекты вы хотите назначить или что вы хотите делать со списком после того, как вы присвоите объектам значения в нем. Вот ответ, который буквально воспринимает ваш вопрос ...

l[0] = object()

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


4 выбрать первое, последнее или количество значений в каждой строке?

Это зависит от того, как именно вы хотите их выбрать. Если вы хотите сделать это индивидуально, вы делаете это следующим образом:

first_word_of_first_line = l[0][0]
last_word_of_first_line = l[0][-1]
first_word_of_last_line = l[-1][0]
last_word_of_last_line = l[-1][-1]
first_five_words of_second_line = l[1][0:5] # The : is for specifying a range of values
last_five_words_of_first_line = l[0][-5:] # The : with no end means 'until the end'

К сожалению, способ получить первые 4 слова первых 2 строк не такой:

first_four_words_of_first_two_lines = l[0:2][0:4] # DOESN'T WORK!!!

Причина этого заключается в том, что результатом выборки диапазона значений из списка является список, и поэтому [0:4] применяется вместо этого списка. Что вы действительно хотите сделать, это применить [0:4], чтобы применить к каждому элементу результирующего списка, чтобы создать новый список. Вот как бы вы это сделали:

first_four_words_of_first_two_lines = [x[0:4] for x in l[0:2]]

Это дает вам новый список, который выглядит следующим образом (учитывая пример для вопроса 1):

[('This', 'is', 'the', 'first'),
 ('This', 'is', 'the', 'second')]

Надеюсь, это полезно. Как я уже сказал, я думаю, что ваши вопросы указывают на некоторую путаницу в вещах. Но я не знаю, о чем они говорят, так что я просто попытался ответить на них как мог.

0 голосов
/ 15 декабря 2009

Это более оптимизированный способ чтения всего файла, где каждая строка также разбивается на список

import csv, sys

# 1 - User specifies file
file = input('File: ')

f = open(file, 'r')
reader = csv.reader(f, delimiter=' ')
lines = list(reader)
f.close()

# 2 - Select specific lines
print lines[4]

# 3 - Assign to list
lines[4] = obj # makes the whole line into that obj
lines[4][0] = obj # replaces the first item on the line with that obj

# 4 - Select first, last or a number of values
print lines[4][0] # first item in line 4
print lines[4][-1] # last item in line 4
print lines[4][1:4] # 2nd, 3rd and 4th items in line 4
0 голосов
/ 15 декабря 2009

номер 1: Когда вы говорите, что хотите, чтобы файл открывался динамически, вы хотите сказать, что вы хотите, чтобы пользователь вводил имя файла, которое нужно открыть? Если это так, вы можете просто сохранить имя файла в переменной. Например:

name = "myfile.txt"

и замените свой «cluster2.wcnf» на имя.

Номер 4:

Вы можете использовать индексацию, упомянутую SilentGhost, для индексации первого элемента в каждой строке (т. Е. l[0][0]. Для просмотра последнего элемента вы можете использовать отрицательную индексацию; l[0][-1] даст вам последний элемент в первом списке И если вам нужен диапазон предметов, вы можете использовать что-то вроде l[0][2:6], что даст вам предметы с индексами 2, 3, 4 и 5. То есть предметы из диапазона [2,6).

0 голосов
/ 15 декабря 2009

Такие вещи, как открытие файлов с именами, полученными от пользователя (то есть с использованием строк) и выбор / назначение элементов в списке, на самом деле являются очень основными понятиями Python. Я думаю, что лучшее, что вы можете сделать, это прочитать хорошую книгу по Python. Я бы порекомендовал Dive Into Python .

...