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:

andinテストのオペランドをグループ化しません。各コンポーネントは個別に評価されます。

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

"Six" in dataこれは、返される結果につながります。他の2つの値は空でない文字列であるため、常にTrueです。

より良いアプローチは、セットを使用することです:

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)かどうかをチェックします。targetset(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ます。

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

「1つ」、「3つ」、「6つ」がすべて存在する場所が必要な場合は、次のようにします。

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

@MartijnPietersが答えたように。さらに、もう1つのテクニックを取得します。

>>> 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」は「キャスト」toboolean であり、真の値として扱われるため、出力されます。したがって、これが機能するには、条件を次のように書き換える必要があります。

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 に答える