Как использовать цикл for для перебора двух списков в Python? - PullRequest
0 голосов
/ 06 февраля 2019

Нужна помощь, пожалуйста, используйте цикл for с диапазоном и длиной.Два вопроса.

Скажем, у меня есть один список, состоящий из «W» или «L», означающих выигранную или проигранную игру, и второй список с целыми числами, представляющими набранные очки (и позиции соответствуют той же игре), то как я мог написать функцию (без использования функции zip), которая сообщала бы пользователю, например, «сколько игр мы выиграли и набрали ровно 3 очка»? И «сколько игр мы выиграли, набрав хотя бы 9 очков?'?

Сначала я попытался объединить два списка и позиции, т. Е. Позиция 0 будет иметь значение, примерно равное L4. Затем я мог бы искать конкретные критерии, но это затрудняло поиск точекбольше или меньше определенного числа (выиграйте как минимум с x очками).

Теперь я думаю об повторении одного цикла, как я, для меня в диапазоне (х)) и лен. Но яЯ не совсем понимаю, как это будет работать с обоими списками, и я все еще ОЧЕНЬ новичок в кодировании и изучении синтаксиса.

Спасибо за ваш ввод и время

мой код - катастрофа ....

def score_check(lst1, lst2):
    for 'W' in range(lst1[i] if 3 in lst2[i]):
    .........
    .....
    return result 

def main():
    record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
    points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]

    check = score_check(record, points)
    print(check)

main()

Ожидаемые результаты:

2 wins with 3 points scored and
2 wins with at least 9 points scored

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Если вы не можете использовать zip, тогда вы можете просто использовать индекс элементов.

record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]

combined = [{'points': points[i], 'result': record[i]} for i in range(len(record))]

# this way is cleaner
#combined = [{'points': p, 'result': r} for r, p in zip(record, points)] 

Теперь combined - это список словарей, содержащих пары ключ / значение для record и точек entries в ваших исходных списках.Предполагается, что оба списка имеют одинаковую длину, но это разумное предположение, в противном случае ваши данные не являются действительными.zip без проблем справится с этим, остановившись, когда он исчерпает самый короткий из двух списков.Этот код выдавал бы, если бы он пытался получить доступ к несуществующему индексу в любом списке.

Если вы хотите теперь запросить этот список, вы можете просто использовать встроенную функцию filter и передать ей предикат длярешить, что в результатах, а что нет.

пример

print('matches where score was greater than 3')
for result in filter(lambda r: r['points'] > 3, combined):
    print(result)

Это включает в себя любые записи со значением баллов больше 3. Вы также можете легко сделать это < (меньше чем), >= (больше или равно) или == (равно) любому числу, которое вы хотите.

Вы также можете объединить параметр результата в то, что отфильтровано по

print('matches where score was less than 5 but won')
for result in filter(lambda r: r['points'] < 5 and r['result'] == 'W', combined):
    print(result)

Примечание: функция фильтра всегда линейна (O (n)).Они всегда бегают по всем записям.Так что для больших наборов результатов это неэффективно и медленно.Один из способов настройки заключается в сортировке списка по счету и использовании бинарных поисков (в python - модуль bisect), чтобы сузить область поиска.Это будет иметь влияние только в том случае, если вы осуществляете поиск по оценкам.Если вы хотите выполнить поиск по W / L результату, вы вернетесь к линейному.

0 голосов
/ 06 февраля 2019

Так что почтовый индекс не разрешен.Как насчет понимания списка:

def score_check(results, points):
    wins = [points[i] for i, v in enumerate(results) if v == 'W']
    exactly_three = len([win for win in wins if win == 3])
    at_least_nine = len([win for win in wins if win >= 9])

    return (f'{exactly_three} wins with 3 points scored',
            f'{at_least_nine} wins with at least 9 points scored')

record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]

print(*score_check(record, points), sep='\n')

2 wins with 3 points scored
2 wins with at least 9 points scored

Когда параметры функции представляют собой два списка, только для получения желаемого выходного текста и условий должны быть жестко закодированы, а это не оптимальное использование функции.

0 голосов
/ 06 февраля 2019

Итак, я думаю, что лучше всего использовать zip.Но, поскольку вы не хотите этим пользоваться, вы можете:

def score_check(lst1, lst2):
    lst_size_1 = len(lst1)
    lst_size_2 = len(lst2)
    if (lst_size_1 !=lst_size_2):
        return

    for i in range(lst_size):
        print (lst1[i])
        print (lst2[i])

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...