Как извлечь минимальную позицию строки во вложенном списке - PullRequest
0 голосов
/ 10 октября 2018

У меня есть вложенный список words с множеством дубликатов и список uniquewords, который является набором списка words.Я хочу найти минимальную начальную точку элемента в слове.Например:

words = [['apple',5],['apple',7],['apple',8],['pear',9], ['pear',4]
         ['grape',6],['baby',3],['baby',2],['baby',87]]

uniquewords = ['apple','pear','grape','baby']

Я хочу получить конечный результат:

[0,3,5,6]

Я пытался использовать enumerate(), потому что index() не работает с вложенным списком.

a = []
>>> for i in range(len(uniquewords)):
...     for index,sublist in enumerate(words):
...         if uniquewords[i] in sublist:
...             a.append(min(index)) 
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
TypeError: 'int' object is not iterable

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

Ответы [ 3 ]

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

За мой комментарий:

# dictionary comprehension... make an empty list entry for each word
k = {word[0]:list() for word in words}
# iterate through the list appending the word occurrence list entries
for word in words:
    k[word[0]].append(word[1])
0 голосов
/ 11 октября 2018

Мы можем использовать itertools.groupby из-за формата этого списка и захватить индекс первого элемента в list(g) для groupby(words, key=lambda x: x[0])

res = [words.index(list(g)[0]) for k, g in groupby(words, key=lambda x: x[0])]

Расширен:

res = []
for k, g in groupby(words, key=lambda x: x[0]):
    res.append(words.index(list(g)[0]))

print(res)
# [0, 3, 5, 6]

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

res = []
for i in uniquewords:
    for j in words:
        if i in j:
            res.append(words.index(j))
            break
print(res)
# [0, 3, 5, 6]
0 голосов
/ 10 октября 2018

Одним из способов является создание словаря, отображающего слова в индексы через простой цикл for, только если слово не считывается, существует в словаре.Затем используйте map, чтобы извлечь индекс для каждого слова в uniquewords.

d = {}
for idx, (word, _) in enumerate(words):
    if word not in d:
        d[word] = idx

res = list(map(d.__getitem__, uniquewords))

print(res)

[0, 3, 5, 6]
...