编辑:我使用的是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')
答案 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)
会检查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
中。
答案 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')
>>>