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