在字符串python中查找公共元素

时间:2013-11-21 01:14:06

标签: python

我正在尝试从文件中读取字符串中的常用元素。这就是我写的:

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),但结果是空的。

2 个答案:

答案 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 Truewhile 1更清晰。

答案 1 :(得分:0)

我建议修改功能如下:

def com_Letters(strings):
    return set.intersection(*map(set,strings))

我认为该函数将参数字符串视为字符串列表的列表(在这种情况下只传递一个参数为单个列表),因此找不到交集。