Что-то не так с выводом из списка в Python - PullRequest
2 голосов
/ 13 апреля 2009

Я хочу, чтобы программа на Python импортировала список слов из текстового файла и распечатывала содержимое текстового файла в виде двух списков. Данные в текстовом файле находятся в этой форме:

A Alfa
B Betta
C Charlie

Я хочу, чтобы программа на Python распечатывала один список с A, B, C и один с Alfa, Betta, Charlie.

Вот что я написал:

english2german = open('english2german.txt', 'r')
englist = []
gerlist = []

for i, line in enumerate(english2german):
    englist[i:], gerlist[i:] = line.split()

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

Ответы [ 6 ]

6 голосов
/ 13 апреля 2009

И даже короче ответа amo-ej1 и, вероятно, быстрее:

In [1]: english2german = open('english2german.txt')
In [2]: eng, ger = zip(*( line.split() for line in english2german ))
In [3]: eng
Out[3]: ('A', 'B', 'C')
In [4]: ger
Out[4]: ('Alfa', 'Betta', 'Charlie')

Если вы используете Python 3.0 или from future_builtins import zip, это также экономно использует память. В противном случае замените zip на izip из itertools, если english2german очень длинный.

6 голосов
/ 13 апреля 2009

Вы хотите что-то вроде этого:

english2german = open("english2german.txt")
englist = []
gerlist = []

for line in english2german:
    (e, g) = line.split()
    englist.append(e)
    gerlist.append(g)

Проблема с вашим кодом ранее заключалась в том, что englist[i:] - это на самом деле срез списка, а не просто один индекс. Строка также является итеративной, поэтому вы в основном вставляли одну букву в несколько индексов. Другими словами, что-то вроде gerlist[0:] = "alfa" на самом деле приводит к gerlist = ['a', 'l', 'f', 'a'].

3 голосов
/ 13 апреля 2009

просто дополнение: вы работаете с файлами. закройте их :) или используйте конструкцию with:

with open('english2german.txt') as english2german:
  englist, gerlist = zip(*(line.split() for line in english2german))
1 голос
/ 13 апреля 2009

Немного мета-ответа (?) На Предложение автоплектики об использовании zip()

С 3 строками во входном файле (из предоставленных данных в вопросе):

Метод zip() занимает в среднем 0.404729390144 секунд по сравнению с 0.341339087486 с простым циклом for, строящим два списка (код из принятого в настоящее время ответа * mipadi ).

С 10 000 строк во входном файле (случайным образом сгенерированные слова из 3-12 символов. Я уменьшил значения timeit.repeat() до 100 раз, повторяя дважды):

zip() занимает в среднем 1.43965339661 секунд по сравнению с 1.52318406105 с циклом for.

Оба теста были выполнены с использованием Python версии 2.5.1

Едва огромная разница. Учитывая, насколько простым для чтения является простой цикл for, я бы порекомендовал его использовать. Код zip может быть немного быстрее с большими файлами, но разница составляет около 0,083 секунды с 10 000 линии ..

Код бенчмаркинга:

import timeit

# /423380/chto-to-ne-tak-s-vyvodom-iz-spiska-v-python#423384
code_zip = """english2german = open('english2german.txt')
eng, ger = zip(*( line.split() for line in english2german ))
"""

# https://stackoverflow.com/questions/743248/something-wrong-with-output-from-list-in-python/743268#743268
code_for = """english2german = open("english2german.txt")
englist = []
gerlist = []

for line in english2german:
    (e, g) = line.split()
    englist.append(e)
    gerlist.append(g)
"""

for code in [code_zip, code_for]:
    t = timeit.Timer(stmt = code)
    try:
        times = t.repeat(10, 10000)
    except:
        t.print_exc()
    else:
        print "Code:"
        print code
        print "Time:"
        print times
        print "Average:"
        print sum(times) / len(times)
        print "-" * 20
1 голос
/ 13 апреля 2009

Уже опубликованные решения в порядке, если у вас нет пробелов ни в одном из слов (то есть каждая строка имеет один пробел). Если я правильно понимаю, вы пытаетесь создать словарь, поэтому я бы посоветовал вам рассмотреть тот факт, что вы также можете иметь определения нескольких словосочетаний. В этом случае вам лучше использовать какой-то другой символ вместо пробела, чтобы отделить определение от слова. Нечто подобное «|», которое невозможно отобразить одним словом.

Затем вы делаете что-то вроде этого:

for line in english2german:
    (e, g) = line.split("|")
    englist.append(e)
    gerlist.append(g)
1 голос
/ 13 апреля 2009

Как это вы имеете в виду:

english2german = open('k.txt', 'r')
englist = []
gerlist = []

for i, line in enumerate(english2german):
    englist.append(line.split()[0])
    gerlist.append(line.split()[1])

print englist
print gerlist

, который генерирует:

['A', 'B', 'C'] ['Альфа', 'Бетта', 'Чарли']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...