Уменьшите использование цикла for при проверке строк в списках в Python - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы найти способ или способ сократить использование цикла for.Я пытался проверить документацию itertools, но не могу найти какие-либо соответствующие.В настоящее время я использую по крайней мере 4-5 раз для цикла, и это сделает цикл слишком сложным и слишком трудоемким при наличии большого набора данных.

Есть ли способ уменьшить использование цикла for?Моя главная цель - узнать о сокращении использования цикла for, а не о выходе.

Вот мой код:

aa = [[[] for i in range(10)] for i in range(10)]


diction = {"m":"something", "k":"something", "a":"something"}
a = [["m", "baba", "black", "no", "sheep"], ["k", "kong", "came", "out"]]

for opt in diction.keys():
    for i, ix in enumerate(a):
        for ii, iix in enumerate(ix):
            for iixx in iix:
                print(iixx)
                if opt == iixx:
                    aa[i][ii].append(
                            [iixx])

Цель вопросов:

Сокращение с 4-5 раз для цикла до 1-2, если это возможно, или 1-3.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы можете использовать индексный диктат для отслеживания двух индексов каждого символа, а затем использовать набор пересечений для поиска совпадающих символов.Ключ заключается в том, чтобы воспользоваться преимуществами O(1) среднего времени поиска для диктов и линейного среднего времени поиска для установленных пересечений:

aa = [[[] for i in range(10)] for i in range(10)]
index = {}
for i, l in enumerate(a):
    for j, s in enumerate(l):
        for c in s:
            index.setdefault(c, []).append((i, j))
for c in diction.keys() & index.keys():
    for i, j in index[c]:
        aa[i][j].append([c])
0 голосов
/ 12 октября 2018

Вместо самого внутреннего цикла вы можете проверить, если opt in iix, что немного чище.

Вы также можете сделать все это в понимании списка, что быстрее:

aa = [[[opt for opt in diction if opt in iix] for iix in ix] for ix in a].

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

edit: исключительно проверка содержимого даст другой ответ, если слово содержит более одногоэкземпляр данного ключа

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