2015-07-22 3 views
3

Есть ли более питоновский способ написать код внизу, чтобы он выполнял итерацию над некоторым условием, но также сохранил индекс итераций?Есть ли питонический способ сделать цикл while с индексом?

def TrieMatching(text, trie): 
    match_locations = [] 
    location = 0 
    while text: 
     if PrefixTrieMatching(text, trie): 
      match_locations.append(location) 
     text = text[1:] 
     location += 1 
+0

Как вы думаете, что делает эта строка: 'text [1:]'? –

+0

Это была ошибка; Я имел в виду 'text = text [1:]' – jukhamil

+0

Интересно, будет ли это лучше подходит для http://codereview.stackexchange.com? –

ответ

4

Вы всегда растет i так просто использовать диапазон:

def TrieMatching(text, trie): 
    match_locations = [] 
    for i in range(len(text)): 
     if PrefixTrieMatching(text[i:], trie): 
      match_locations.append(i) 
+1

В этом случае нет необходимости переназначать 'text = text [1:]'. Просто переключитесь на 'if PrefixTrieMatching (текст [i:], trie)', вероятно, лучше. – mehtunguh

+0

@mehtunguh, да, это больше, чтобы показать, что вам действительно нужно переназначить текст, чтобы на самом деле изменить то, на что указывает это имя. 'text [i:]' в коде OP не много делает –

0

enumerate() это отличный способ перебрать что-то и получить индекс, а также. Она возвращает итератор, который дает кортежи (счетчик, значение)

https://docs.python.org/2/library/functions.html#enumerate

Из документов:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] 
>>> list(enumerate(seasons)) 
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] 

Таким образом, вы можете использовать его в цикле действительно легко:

for (i,season) in enumerate(seasons): 
    print "{} {}".format(i,season) 

отпечатки:

0 Spring 
1 Summer 
2 Fall 
3 Winer 
+0

Но вы обнаружите, что вы пытаетесь использовать его в этой конкретной проблеме, что это не очень помогает. – holdenweb

+0

@holdenweb на самом деле отвечает на вопрос, который задают очень хорошо, хотя это не очень хорошо для конкретного приведенного примера. – mehtunguh

+0

@mehtungu Спасибо за ваш комментарий. Проблема, похоже, в том, отвечает ли она на этот вопрос. Я бы хотел увидеть фактический ответ на вопрос (_ «Есть ли более Pythonic way» _), используя 'enumerate', прежде чем я удалю этот комментарий (который, если не так, я с удовольствием сделаю - я не заинтересован в продвижении ложных техническая информация, и я не безошибочна). К сожалению, мой downvote теперь заблокирован, если не отредактирован A. – holdenweb

-1

Я бы не обязательно использовал это, но itertools.count() is [1, 2, 3, ...].

import itertools 
for i in itertools.count(): 
    ... 
+0

Пожалуйста, дайте решения как ответы, а не предложения – holdenweb

5

Я всегда увлекался списком понятий.

def TrieMatching(text, trie): 
    match_locations = [ 
     location 
     for location in range(len(text)) 
     if PrefixTrieMatch(text[location:],trie) 
    ] 
+1

Предположительно, вы опустили 'return', потому что вопрос также сделал, но он делает функцию менее полезной – holdenweb

+0

Meh. Если ваше понимание списка должно разбить несколько строк, просто используйте цикл for. – mehtunguh

0

enumerate часто используется для отслеживания индекса в цикле for. Вот пример того, как его использовать.

for i, elem in enumerate("abc"): 
    print(i, elem) 

0 a 
1 b 
2 c 

В вашем примере, вы не используете elem, как и в предыдущем случае, так enumerate не может быть лучшим решением. Вероятно, вы должны либо попробовать использовать range, либо придерживаться цикла while, который у вас уже есть.

for location in range(len(text)): 
    if PrefixTrieMatching(text[location:], trie): 
     match_locations.append(location) 
1

Вы когда-нибудь слышали старую поговорку «Дайте человеку молоток, и вдруг все его проблемы будут похожи на гвозди»? Цикл while не является молотком.

Зачем использовать петлю while? Если я прав, ваша проблема может быть указана без ссылки на них как «составить список местоположений всех суффиксов text, которые соответствуют заданному trie».

Это можно записать в виде списка понимания:

def TrieMatching(text, trie): 
    return [l for l in range(len(text)) if PrefixTrieMatching(text[l:], trie)] 

Я добавил return, как нет смысла в вычислении значения только чтобы сохранить ссылок на нее.

Смежные вопросы