2013-03-15 22 views
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') 

回答

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): 
+0

这样做,谢谢。 – Hoser 2013-03-15 18:41:31

0

这背后的原因是,你滥用and

尝试

"One" and "Three" 

在交互式控制台 - 它会输出True,因为“一”和“三”是“施放”tobooleans,他们被视为真正的价值观。所以,对于这个工作,你应该重写条件

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

“One”和“Three”实际上会返回“Three”,因为“One”计算结果为True,因此返回值为“and”的第二个操作数。 – poke 2013-03-15 18:42:29

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

0

你为什么不测试它作为一组:

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

结果:

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

注意,当您测试一组有问题的顺序。

0

其实,你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: 

在哪里,你需要的地方 “一” ,“三”和“六”都存在,所以如下所示:

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

由于@Martijn皮特斯回答。另外获得一项技术:

>>> target = {"One", "Three", "Six"} 
>>> for data in matrix: 
...  if (set(map(tuple, data)) <= set(map(tuple, target))): 
...    print data 
... 
('One', 'Three', 'Six') 
>>>