Python 比较列表中的多个唯一字符串
编辑:我正在使用Python 2.7 我有一个给定的“矩阵”,如下所示,其中包含多个字符串列表。我想对矩阵进行排序,只打印出只包含一组特定字符串的行 有谁能给我一个关于如何做这件事的提示吗 到目前为止,我所尝试的: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
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')
>>>