比较列表中的多个唯一字符串

时间:2013-03-15 18:37:42

标签: python list python-2.7

编辑:我使用的是Python 2.7

我有一个给定的'矩阵',如下所示,其中包含多个字符串列表。我想通过矩阵排序,只打印出只包含一组特定字符串的行。

任何人都能给我一个如何解决这个问题的提示吗?

到目前为止我尝试过:

matrix = [("One", "Two", "Three"),
("Four", "Five", "Six"),
("Seven", "Eight", "One"),
("Four", "Five", "Six"),
("One", "Three", "Six")]

for index, data in enumerate(matrix):
    if "One" and "Three" and "Six" in data:
        print data

期望的输出:

("One", "Three", "Six")

实际输出(截至目前):

('Four', 'Five', 'Six')
('Four', 'Five', 'Six')
('One', 'Three', 'Six')

5 个答案:

答案 0 :(得分:8)

您的测试不正确,您希望使用in单独测试每个字符串:

if "One" in data and "Three" in data and "Six" in data:

and不会对in测试的操作数进行分组;每个组件分别进行评估:

("One") and ("Three") and ("Six" in data):

导致返回"Six" in data的结果;其他两个值肯定都是True,因为它们是非空字符串。

更好的方法是使用set

if {"One", "Three", "Six"}.issubset(data):

答案 1 :(得分:2)

我会使用套装:

matrix = [("One", "Two", "Three"),
("Four", "Five", "Six"),
("Seven", "Eight", "One"),
("Four", "Five", "Six"),
("One", "Three", "Six")]

target = {"One", "Three", "Six"}

for row in matrix:
    if target <= set(row):
         print row

此处,target <= set(row)会检查targetset(row)的子集。

您的代码不起作用的原因如下:

if "One" and "Three" and "Six" in data:

相当于:

if bool("One") and bool("Three") and ("Six" in data):

由于bool("One")bool("Three")True,因此整个表达式只会检查"Six"是否在data中。

答案 2 :(得分:0)

背后的原因是你误导了and

尝试

"One" and "Three"

在交互式控制台中 - 它将输出True,因为“一个”和“三个”是“强制转换”的,并且它们被视为真值。因此,为了使其工作,您应该将条件重写为

if "One" in data and "Three" in data and "Six" in data

答案 3 :(得分:0)

为什么不将它作为一套进行测试:

for data in matrix:
    if set(["Three","Six","One"]).issubset(set(data)):
        print data

结果:

('One', 'Three', 'Six').

请注意,当您作为集合进行测试时,排序存在问题。

答案 4 :(得分:0)

实际上,使用您的if声明

 if "One" and "Three" and "Six" in data: 

您获取包含Six的所有列表,(注意您的输出

("Seven", "Eight", "One")("One", "Two", "Three")未打印,因为Six不在您的元组中:

此外,每个字符串(不是"")if在python中为true,例如:

>>> if("One"):
...     print "Yes"
... else:
...     print "No"
... 
Yes

所以,如果表达

 if "One" and "Three" and "Six" in data: 

相当于

 if True and True and "Six" in data: 

相当于:

 if "Six" in data:   

如果您需要“One”,“Three”和“Six”的所有位置,请执行以下操作:

if  ( ("One" in data) and 
      ("Three" in data) and 
      ("Six" in data)
     ):

@Martijn Pieters回答。另外还有一种技术:

>>> target = {"One", "Three", "Six"}
>>> for data in matrix:
...     if (set(map(tuple, data)) <= set(map(tuple, target))):
...             print data
... 
('One', 'Three', 'Six')
>>>