繁体   English   中英

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

[英]Compare multiple unique strings in a list

编辑:我使用的是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')

您的测试不正确,您想要使用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"Six" in data的结果; 其他两个值肯定都是True,因为它们是非空字符串。

更好的方法是使用一

if {"One", "Three", "Six"}.issubset(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

这里, target <= set(row)检查target是否是set(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

这背后的原因是你误用了and

尝试

"One" and "Three"

在交互式控制台中 - 它会输出True ,因为“One”和“Three”是“cast”tobooleans,并且它们被视为真正的值。 所以,为了这个工作,你应该重写条件

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

你为什么不把它作为一套测试:

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所有列表,( 注意你的输出

("Seven", "Eight", "One")("One", "Two", "Three")没有打印,因为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 "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')
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM