3

编辑:我正在使用 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')
4

5 回答 5

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):
于 2013-03-15T18:39:18.740 回答
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)检查是否target是 的子集set(row)

您的代码不起作用的原因是:

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

相当于:

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

因为bool("One")and bool("Three")are True,整个表达式只检查是否"Six"是 in data

于 2013-03-15T18:40:18.340 回答
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:   

如果您需要“一”、“三”和“六”都存在的地方,请这样做:

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')
>>> 
于 2013-03-15T18:54:44.273 回答
0

这背后的原因是你滥用and

尝试

"One" and "Three"

在交互式控制台中 - 它会输出True,因为 "One" 和 "Three" 是 'cast' tobooleans,它们被视为真值。因此,要使其正常工作,您应该将条件重写为

if "One" in data and "Three" in data and "Six" in data
于 2013-03-15T18:40:13.073 回答
0

你为什么不把它作为一个集合来测试:

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

结果是:

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

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

于 2013-03-15T18:47:07.773 回答