0

私が編集したリストがあるとしましょう。それはもはや「リスト」と呼ばれるだけではありません。

my_list = ['a b', 'b c d e', 'c', 'd e f g h', 'e f g h i j', 'f g h', 'g h']

リスト内の特定の要素を調べて、要素の1つに特定の文字列が含まれているかどうかを確認しようとしています。私は以下のコードの行に沿って何かを使用しています:

for i in range(len(my_list)):
    splitList = my_list[i].split(' ')
    if splitList[3] == "c":
        print "True"
    else:
        print "False"

しかし、私が本当にやりたいのは、splitList [3]が存在するかどうかを確認し、存在する場合は== "c"であるか、要素の3番目の"thing"を出力することです。(私は私の質問では一般的ですが、実際のデータは特定の3文字の文字列を探しています)正規表現は私のすべての問題を解決すると確信していますが、私は何日も完璧な正規表現ソリューションを探していて、圧倒されていますそして解決策なしで。私のデータは非常に予測可能であり、リストの要素の2番目の単語がそこにあるかどうかを確認する必要があります。

リストに特定のインデックスに何かがあるかどうか、そしてそこから続くかどうかを確認する簡単なpythonicの方法はありますか?


正規表現の解決策を提案したい場合、私のリストの24番目の要素は常に「G#Abc」です。「#」は1〜12を含むことができ、25番目の要素も
「G#Abc」で「#」を1〜12にすることができます。 25番目の要素が「G#Abc」の形式でない場合、その要素と他の要素は関係ありません。「G#Abc」の形式の場合は、新しいリストに番号を追加する必要があります。

4

3 に答える 3

7

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。

relevant_elements = set()
for values in my_list:
    try:
        elt = values.split()[3]
    except IndexError:
        continue
    else:
        if is_correct_format(elt):
            relevant_elements.add(elt)
于 2012-06-01T17:07:51.620 に答える
4

任意の文字列を指定して、を使用'x y z'してリストに分割する['x', 'y', 'z']'x y z'.split()、インデックスが存在するかどうかをテストする簡単なpythonicの方法はですlen。上記のコードを少し変更します。

# don't use `list` as a variable name; it masks the built-in `list` constructor
str_list = ['a b', 'b c d e', 'c', 'd e f g h', 'e f g h i j', 'f g h', 'g h']
for s in str_list:
    split_list = s.split(' ')
    if len(split_list) > 3 and split_list[3] == 'c':
        print "True"
    else:
        print "False"
于 2012-06-01T17:09:58.313 に答える
4

関数型プログラミングの力を利用してください。

Python2の場合:

from itertools import imap
for i in (x[3] for x in imap(str.split, input_strings) if len(x) >= 4):
     print i

Python3の場合:

for i in (x[3] for x in map(str.split, input_strings) if len(x) >= 4):
     print(i)

@ thg435による言及:「 py2ソリューションをpy3と同一にするために使用できます。from future_builtins import map」)from __future__ import print_function

説明:

  • str.splitは、空白文字(の実行)で入力を分割する関数です。
  • mapそれぞれ imapリストのすべてのメンバーに適用します。どちらの関数もジェネレータを生成します。
  • 4番目のif len(x) >= 4アイテム(インデックス3にある)が存在するかどうかをテストします。
  • (x[3] for x in ... if ...)、分割文字列リストの4番目の要素を受け取るジェネレータを生成します。
于 2012-06-01T17:11:59.543 に答える