我希望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()
这是两个列表,但只会打印出每个单词中的第一个字母。 如何让我的代码打印出整个单词?
答案 0 :(得分:6)
你想要这样的东西:
english2german = open("english2german.txt")
englist = []
gerlist = []
for line in english2german:
(e, g) = line.split()
englist.append(e)
gerlist.append(g)
之前代码的问题是englist[i:]
实际上是列表的 slice ,而不仅仅是单个索引。字符串也是可迭代的,因此您基本上将一个字母填充到多个索引中。换句话说,gerlist[0:] = "alfa"
之类的内容实际上会产生gerlist = ['a', 'l', 'f', 'a']
。
答案 1 :(得分:6)
甚至比amo-ej1's answer更短,而且可能更快:
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
。
答案 2 :(得分:3)
只是一个补充:你正在使用文件。 请关闭它们:)或使用with construct:
with open('english2german.txt') as english2german:
englist, gerlist = zip(*(line.split() for line in english2german))
答案 3 :(得分:1)
你喜欢这个意思:
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'] ['Alfa','Betta','Charlie']
答案 4 :(得分:1)
如果任何单词中没有空格(即每行有一个空格),已发布的解决方案就可以了。如果我理解正确,你正在尝试建立一个字典,所以我建议你考虑一个事实,你也可以有多个单词表达的定义。在这种情况下,您最好使用其他字符而不是空格来将定义与单词分开。像“|”这样的东西,不可能出现在单词中。
然后,你做这样的事情:
for line in english2german:
(e, g) = line.split("|")
englist.append(e)
gerlist.append(g)
答案 5 :(得分:1)
对使用zip()
输入文件中有3行(来自问题中提供的数据):
zip()
方法平均0.404729390144
秒,与0.341339087486
相比,简单的for循环构建两个列表(来自mipadi's当前接受的答案的代码)。
输入文件中有10,000行(随机生成3-12个字符。我将timeit.repeat()
值减少到100次,重复两次):
zip()
for for循环相比, 1.43965339661
平均花费1.52318406105
秒。
这两个基准测试都是使用Python 2.5.1版完成的。
几乎没有太大的区别..鉴于循环的简单性是多么可读,我建议使用它。zip
代码对于大文件可能会快一点,但差异大约是0.083秒有10,000行..
基准代码:
import timeit
# https://stackoverflow.com/questions/743248/something-wrong-with-output-from-list-in-python/743313#743313
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