понимание списка, возвращающее 3 значения - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы сделать понимание списка, поскольку использование цикла for замедлит работу программы, поэтому я хочу преобразовать его в списки.Однако я хотел, чтобы он возвращал 3 значения, в основном i, ii и word.Я попробовал свой метод, но я получил такие ошибки, как:

Ошибки:

ValueError: not enough values to unpack (expected 3, got 0)

Кратко о моих типах кодов:

words: Is a list[List[string]] # [["I","have","something","to","buy"]]
word: is a word in string type

Код:

i, ii, word = [[i, ii, word] for i, w in enumerate(words) for ii, ww in
                     enumerate(w) for wwd in ww if word == wwd]

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

Например, список i будет содержать индекс для слов, список ii будет содержать индекс для w, а слово - это просто список строк, похожих на wwd.

i = [0,1,2,3,4,5,6,7,8,9,10 ~] # this index should be relevant to the matching of wwd == word
ii = [0,1,2,3,4,5,6,7,8,9,10 ~] # this index should be relevant to the matching of wwd == word
word = ["I", "have", "something"] # this is received when comparing the wwd with word

#Another example: i= 2, ii= 4, word = "have" and then store it to the variables for each matching of word. 

Мне интересно, есть ли более короткая версия и как я могу решить мою текущую проблему?

Полная версия моей проблемы:

Мой код:

wordy = [['I', 'have', 'something', 'to', 'buy', 'from', 'home', ',']]
key = {'I': 'We', 'king': 'man', 'value': 'time'}
a = []

def foo(a,b,c): return a,b,c

for ll in key.keys():
    for ii, l in enumerate(wordy):
        for i, word in enumerate(l):
            for wordd in word:
                if ll == wordd:
                    a.append(list(zip([ii, i, ll])))

for x in a:
    i, ii, ll = foo(*x)

print(i,ii,ll)



for ll in key.keys():
    a = [[i, ii, ll]for i, words in enumerate(wordy) for ii, word in enumerate(words) for wordd in word if ll == wordd]
print(a)
for x in a:
    i, ii, ll = foo(*x)
print(i, ii, ll)

Мой текущий вывод:

0 0 I
[]
0 0 value

Ожидаемый вывод:

0 0 I
[]
0 0 I

Я не знаю, почему при использовании списочных представлений значение «ll» становится другим.

Ответы [ 2 ]

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

Я думаю, это то, что вы пытаетесь сделать:

wordlist = [['I', 'have', 'something', 'to', 'buy', 'from', 'home', ','],['You', 'king', 'thing', 'and', 'take', 'to', 'work', ',']]
dictionary = {'I': 'We', 'king': 'man', 'value': 'time'}
forloopoutput = []
listcompoutput = []

#For Loop
for key in dictionary.keys():
    for wlist_index, wlist in enumerate(wordlist):
        for word_index, word in enumerate(wlist):
            if key == word:
                forloopoutput.append([wlist_index, word_index, word])

#List comprehension
listcompoutput = [[wlist_index, word_index, word] for word_index, word in enumerate(wlist) for wlist_index, wlist in enumerate(wordlist)for key in dictionary.keys() if key==word]

Для ясности я изменил несколько вещей:

  • Я дал переменным более четкие значения (но более длинные) имена, чтобы сделать для более легкого объяснения.
  • Я предполагаю, что ваш "многословный" список является вложенным списком, потому что в вашем примере из реальной жизни вы ожидаете несколько списков, поэтому я добавил еще один список в мой пример, чтобы продемонстрировать его использование.
0 голосов
/ 10 октября 2018

Вы можете использовать zip с оператором * для распаковки последовательностей:

i, ii, word = zip(*([a, b, c] for ...))

Это предполагает, что вы можете заполнить ... чем-то, что имеет смысл.Обратите внимание, в частности, что создание промежуточного списка не требуется.Вы можете использовать выражение генератора, указанное в круглых скобках вместо квадратных скобок.

Технически ваши результаты будут кортежами, а не списками.Для списков вы можете использовать map:

i, ii, word = map(list(zip(*...)))
...