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

在python字符串中查找公共元素,python,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'

我试图在从文件读取的字符串中找到公共元素。这就是我写的:

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','cocoil']


我输入了
com\u字母(行)
,但结果为空。

我建议修改函数如下:

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

我认为该函数将参数字符串视为字符串列表(在本例中,只有一个参数传递为单个列表),因此没有找到交集。

有两个问题,但两个问题都不具有
com\u字母

首先,此代码保证
始终为空列表:

while 1:
    line = file.readlines()
    if len(line) == 0:
        break
    print line
第一次通过循环时,您调用

使用readline()读取直到EOF,并返回一个包含这样读取的行的列表

如果文件为空,则为空列表,因此您将中断

否则,您将打印出列表,然后返回循环。在这一点上,
readlines()
将没有什么可读的了,因为在EOF之前您已经读过了,所以它肯定是一个空列表。这意味着你会崩溃

无论如何,
列表
最终都是空的

不清楚你想用这个循环做什么。在同一个文件上重复调用
readlines()
从来没有什么好的理由。但是,即使有,您也可能希望累积所有结果,而不是只保留最后一个(保证为空)结果。大概是这样的:

while 1:
    new_line = file.readlines()
    if len(new_line) == 0:
        break
    print new_line
    line += new_line

无论如何,如果您解决了这个问题(例如,通过取消整个循环,只使用
line=file.readlines()
),您就可以使用单个字符串列表调用
com\u字母。这不是特别有用;这只是一种非常复杂的调用
set
的方法。如果不清楚原因:

  • 由于只有一个参数(字符串列表),
    *strings
    最终成为该参数的一个元素元组
  • map(set,strings)
    在单个元素元组上只调用该元素上的
    set
    ,并返回单个元素列表
  • *map(set,strings)
    将其分解为一个参数,即set
  • set.intersection(s)
    s.intersection()
    相同,后者只返回
    s
    本身

如果您将一些复杂的表达式分解并
print
ed中间值,所有这些都会更容易看到。然后你就可以确切地知道它第一次出错的地方,而不仅仅是知道它在一长串事件中的某个地方


一些旁注:

您忘记了
文件上的
()
。请关闭
,这意味着您实际上没有关闭该文件。使用
更好的原因之一是它意味着你不能犯那个错误

集合使用复数名称
line
听起来像是一个应该只有一行的变量,而不是一个应该有所有行的变量

没有sizehint参数的
readlines
函数基本上是无用的。如果您只是要在这些行上进行迭代,那么可以对文件本身进行迭代。如果您确实需要列表中的行,而不是懒洋洋地阅读它们,
list(file)
会让您的意图更加清晰,并且不会误导您,让您认为重复阅读可能有用

检查空集合的python方法只是
如果不是line:
,而不是
如果len(line)==0:


while True
更清晰,while 1

嘿,
words.txt
里有什么?另外,您希望得到什么样的输出?这个循环应该做什么?保证读到EOF。你是在试图防范一些不可能的事情,还是有其他原因?当我运行这个程序时,不管文件中有什么,我实际上得到了
TypeError:set对象的描述符“交集”需要一个参数,而不是一个空的结果。更一般地说,请阅读,然后给我们一个完整的示例,带有可运行的代码,输入、预期和实际输出等。仅显示一个代码示例,然后试图描述在进行一些模糊指定的更改时发生的情况,这使得调试代码非常困难。