2

特定のアイテムが表示された後にすべてのアイテムを表示するようにリストをフィルタリングするために、この関数を作成しました。組み込みの文字列メソッドにやや似ていますstr.rpartition(sep)。おそらくリスト内包表記を使用して、これを行うためのよりコンパクトな方法があると感じています。何か案は?

def ignore_until(the_list, match):
    # Ignore all items in the_list prior to match
    found = False
    for index, item in enumerate(the_list):
        if item == match:
            found = True
            break
    if found:
        return the_list[index:]
    else:
        return []

my_list = ['red','orange','yellow','green']
assert ignore_until(my_list, 'yellow') == ['yellow','green']
assert ignore_until(my_list, 'blue') == []

編集:

上記の質問に対する回答を見た後、6 つの回答のうち 5 つがindex()リスト データ型の組み込みメソッドに焦点を当てていることに気付きました。実際、私は正規表現を使用する必要があり、質問からそれを省略すると人々の回答に影響を与えることに気づきませんでした。正規表現コードは次のとおりです。

import re
def ignore_until(the_list, pattern):
    # Ignore all items in the_list prior to the item containing pattern.
    found = False
    for index, item in enumerate(the_list):
        if re.search(string=item, pattern=pattern):
            found = True
            break
    if found:
        return the_list[index:]
    else:
        return []

my_list = ['red','orange','yellow','green']
assert ignore_until(my_list, 'yellow') == ['yellow','green']
assert ignore_until(my_list, 'blue') == []
4

6 に答える 6

5

それほどコンパクトではありませんが、どうでしょうか:

def ignore_until(the_list, match):
    try:
        return the_list[the_list.index(match):]
    except ValueError:
        return []

my_list = ['red','orange','yellow','green']

print ignore_until(my_list, 'yellow') # => ['yellow','green']
print ignore_until(my_list, 'blue') # => []
于 2012-05-12T16:19:41.910 に答える
3

Pythonyourlist.index(match)を使用してインデックスを見つけてから、リストのスライスを適用してみませんか。yourlist.index一致するものが見つからない場合、pythonはエラーをスローするので、それを処理する必要があります。

def ignore_until(yourlist, match):
    try:
        return yourlist[yourlist.index(match):]
    except ValueError:
        return []
于 2012-05-12T16:17:47.143 に答える
2

str.partition の動作を再現したバージョンを次に示します (つまり、3 つのリストを返します)。

def partition(lst, item):
    if item in lst:
        n = lst.index(item)
        return lst[:n], [item], lst[n+1:]
    else:
        return lst, [], []

print partition(range(10), 7)

そして、これは必要なリストではなく、任意のイテラブルで動作するバージョンです:

def partition(it, item):
    a = [[]]
    for x in it:
        if x == item and len(a) == 1:
            a.append([item])
            a.append([])
        else:
            a[-1].append(x)
    return a

print partition((x for x in range(10)), 7)

改良版:

def partition(it, item):
    a = []
    for x in it:
        if x == item:
            return a, [item], list(it)
        a.append(x)
    return a, [], []

print partition((x for x in range(10)), 7)
print partition((x for x in range(10)), 17)
于 2012-05-12T16:43:47.760 に答える
1

これを試して:

def ignore_until(the_list, match):
    try:
        return [the_list[the_list.index(object):] for object in l if object == match][0]
    except IndexError:
        return []

少し読みにくいですが、コンパクトです。

于 2012-05-12T16:21:23.367 に答える
1

list.index() メソッドの使用について考えたことはありますか? 指定された項目の最初のインスタンスのインデックスを返します (またはエラーをスローします)。

def ignore_until(the_list, match):
    if match in the_list:
        index = the_list.index(match)
        return the_list[index:]

    else:
        return []

ソース: http://docs.python.org/tutorial/datastructures.html

于 2012-05-12T16:22:23.070 に答える
1
def ignore_until(the_list, match):
    try:
        return my_list[the_list.index(match):]
    except ValueError:
        return []
于 2012-05-12T16:19:05.260 に答える