我正在尝试从文件中读取字符串中的常用元素。这就是我写的:
file = open ("words.txt", 'r')
while 1:
line = file.readlines()
if len(line) == 0:
break
print line
file.close
def com_Letters(*strings):
return set.intersection(*map(set,strings))
结果显示:['out\n', 'dog\n', 'pingo\n', 'coconut']
我放了com_Letters(line)
,但结果是空的。
答案 0 :(得分:1)
有两个问题,但没有一个是com_Letters
。
首先,此代码保证line
始终为空列表:
while 1:
line = file.readlines()
if len(line) == 0:
break
print line
第一次循环播放时,请拨打readlines()
,
使用readline()读取EOF并返回包含如此读取的行的列表。
如果文件为空,那就是一个空列表,所以你就会中断。
否则,您将打印出列表,然后返回循环。此时readlines()
将无法读取任何内容,因为您已经读过EOF,所以它保证是一个空列表。这意味着你会破产。
无论哪种方式,list
最终都是空的。
目前尚不清楚你要对该循环做些什么。从来没有任何理由在同一个文件上反复调用readlines()
。但是,即使有,你可能想要累积所有结果,而不是只保留最后一个(保证空)结果。像这样:
while 1:
new_line = file.readlines()
if len(new_line) == 0:
break
print new_line
line += new_line
无论如何,如果你解决了这个问题(例如,通过废弃整个循环并只使用line = file.readlines()
),你就会用一个字符串列表调用com_Letters
。那不是特别有用;这只是一种非常复杂的调用set
的方式。如果不清楚为什么:
*strings
最终成为该参数的单元素元组。map(set, strings)
在单元素元组上只调用该元素上的set
并返回单元素列表。*map(set, strings)
将其分解为一个参数,即集合。set.intersection(s)
与s.intersection()
相同,只返回s
本身。如果您分解了一些复杂的表达式并print
编辑了中间值,那么所有这些都会更容易看到。然后你就会确切地知道它首先出错的地方,而不仅仅是知道它是在一系列长事件中的某个地方。
一些附注:
您忘记了()
上的file.close
,这意味着您实际上并没有关闭该文件。 with
更好的众多原因之一就是它意味着你不能犯这个错误。
对集合使用复数名称。 line
听起来像一个应该有一行的变量,而不是一个应该包含所有行的变量。
没有sizehint参数的readlines
函数基本上没用。如果你只是要遍历这些行,你可以对文件本身进行迭代。如果你真的需要列表中的行而不是懒惰地阅读它们,list(file)
会使你的意图更加清晰 - 并且不会误导你认为重复这样做可能有用。
检查空集合的Pythonic方法只是if not line:
,而不是if len(line) == 0:
。
while True
比while 1
更清晰。
答案 1 :(得分:0)
我建议修改功能如下:
def com_Letters(strings):
return set.intersection(*map(set,strings))
我认为该函数将参数字符串视为字符串列表的列表(在这种情况下只传递一个参数为单个列表),因此找不到交集。