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

Python 比较列表中的多个唯一字符串,python,list,python-2.7,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

编辑:我正在使用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")
实际产量(截至目前):


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

if "One" in data and "Three" in data and "Six" in data:
不为
测试中的
对操作数进行分组;每个组件分别进行评估:

("One") and ("Three") and ("Six" in data):
导致返回数据
中的
“六”结果;其他两个值当然总是真的,因为它们是非空字符串

更好的方法是使用:


这背后的原因是您误用了

试一试

在交互式控制台中-它将输出
True
,因为“One”和“Three”是“cast”到ooleans,并且它们被视为真值。因此,要使其工作,您应该将条件重写为

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

我会为此使用集合:

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
相当于:

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

由于
bool(“一”)
bool(“三”)
都是
True
,整个表达式只需检查
“六个”
是否在
数据中

为什么不将其作为一组进行测试:

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

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

注意,当您作为一个集合进行测试时,排序有问题。

实际上,您的
if
语句有问题

 if "One" and "Three" and "Six" in data: 
您将获得包含六个
的所有列表(注意您的输出)

(“七”、“八”、“一”)
(“一”、“二”、“三”)
未打印,因为
Six
不在元组中:

此外,每个字符串(而不是
“”
)如果在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 bool("One") and bool("Three") and ("Six" in data):
 if "Six" in data:   
如果您需要,如果“一”、“三”和“六”都存在,请执行以下操作:

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')
>>> 
目标={“一”、“三”、“六”} >>>对于矩阵中的数据: ... 如果(设置(映射(元组、数据))>>
'One'和'Three'
实际上返回
'Three'
,因为
'One'
的计算结果(不是转换为布尔值)为True,所以返回值是
的第二个操作数。
if  ( ("One" in data) and 
      ("Three" in data) and 
      ("Six" in data)
     ):
>>> target = {"One", "Three", "Six"}
>>> for data in matrix:
...     if (set(map(tuple, data)) <= set(map(tuple, target))):
...             print data
... 
('One', 'Three', 'Six')
>>>