Найти последнее вхождение строки во вложенном списке? - PullRequest
0 голосов
/ 17 апреля 2020
fixed_game_b0_1 = [['f', 3], ['a', 2], ['d', 2], ['f', 4],
               ['b', 2], ['a', 2], ['f', 3], ['f', 3],
               ['e', 1], ['b', 2], ['e', 1], ['c', 1],
               ['a', 3], ['d', 3], ['f', 1], ['f', 4],
               ['b', 4], ['b', 1], ['c', 4], ['d', 1],
               ['a', 3], ['e', 1], ['b', 2], ['c', 3],
               ['d', 3], ['c', 2], ['c', 1], ['a', 2],
               ['d', 4], ['b', 4], ['g', 2]]

token_winner = [0, 0, 0, 0] # 1, 2, 3, 4

У меня есть вложенный список строк и целых чисел. Я хочу иметь возможность найти последнее вхождение каждой буквы в этом списке и добавить +1 к каждому элементу в списке token_winner.

Например, ['a', 2] - последнее вхождение о. Я хочу добавить это ко второму элементу в token_winner. так это будет выглядеть так: token_winner = [0,1,0,0]

Ответы [ 4 ]

0 голосов
/ 17 апреля 2020

Вы можете попробовать что-то вроде этого

mylist = [
    ['f', 3], ['a', 2], ['d', 2], ['f', 4], ['b', 2], ['a', 2], ['f', 3], ['f', 3],
    ['e', 1], ['b', 2], ['e', 1], ['c', 1], ['a', 3], ['d', 3], ['f', 1], ['f', 4],
    ['b', 4], ['b', 1], ['c', 4], ['d', 1], ['a', 3], ['e', 1], ['b', 2], ['c', 3],
    ['d', 3], ['c', 2], ['c', 1], ['a', 2], ['d', 4], ['b', 4], ['g', 2]
]

Вы можете использовать set для хранения уникальных элементов из вложенного списка

unique_items = set(i[0] for i in fixed_game_b0_1)
# {'e', 'a', 'b', 'd', 'c', 'g', 'f'}
token_winner = [0, 0, 0, 0] # 1, 2, 3, 4

Затем вы можете перебирать список от последнего к первому чтобы найти последнее вхождение и разбить l oop, как только вы найдете все вхождения уникальных букв

for i in range(-1, -len(mylist)-1, -1):
    if mylist[i][0] not in unique_items:
        continue
        # moves the control back to the top of the loop. if the char is already found one
    token_winner[mylist[i][1] - 1] = token_winner[mylist[i][1] -1] + 1
    unique_items.remove(mylist[i][0])

    if len(unique_items) < 1:
        break

# output==> token_winner [2, 2, 0, 3] 
0 голосов
/ 17 апреля 2020

для l oop через ваш список в обратном порядке. Вам также придется вычесть 1 из чисел в вашем списке, чтобы соответствовать индексам, поскольку индексы python начинаются с 0, а не с 1.

_found = []
for items in reversed(fixed_game_b0_1):
    string = items[0]
    num = items[1] - 1
    if string not in _found:
        token_winner[num] += 1
        _found.append(string)

print(token_winner)

Если у вас есть тонна данных и вы знаете, сколько различных возможных строк вы ищете и не хотите go просмотреть все ваши данные, а затем в конце каждого l oop вы можете добавить условие для проверки, если вы готово и ломаем l oop:

for items in reversed(fixed_game_b0_1):
    string = items[0]
    num = items[1] - 1
    if string not in _found:
        token_winner[num] += 1
        _found.append(string)
        if len(_found) == 7:
            break

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

Для ясности - некоторые из этих ответов - отличные ответы, но мы понимаем ваш вопрос по-другому - вам нужен последний случай каждая строка, а не последний экземпляр указанной c строки.

0 голосов
/ 17 апреля 2020

Вы можете применить next() с выражением генератора:

fixed_game_b0_1 = [
    ['f', 3], ['a', 2], ['d', 2], ['f', 4], ['b', 2], ['a', 2], ['f', 3], ['f', 3],
    ['e', 1], ['b', 2], ['e', 1], ['c', 1], ['a', 3], ['d', 3], ['f', 1], ['f', 4],
    ['b', 4], ['b', 1], ['c', 4], ['d', 1], ['a', 3], ['e', 1], ['b', 2], ['c', 3],
    ['d', 3], ['c', 2], ['c', 1], ['a', 2], ['d', 4], ['b', 4], ['g', 2]
]
token_winner = [0, 0, 0, 0] # 1, 2, 3, 4

token_winner[next(v - 1 for i, v in reversed(fixed_game_b0_1) if i == 'a')] += 1
0 голосов
/ 17 апреля 2020
fixed_game_b0_1 = [['f', 3], ['a', 2], ['d', 2], ['f', 4],
               ['b', 2], ['a', 2], ['f', 3], ['f', 3],
               ['e', 1], ['b', 2], ['e', 1], ['c', 1],
               ['a', 3], ['d', 3], ['f', 1], ['f', 4],
               ['b', 4], ['b', 1], ['c', 4], ['d', 1],
               ['a', 3], ['e', 1], ['b', 2], ['c', 3],
               ['d', 3], ['c', 2], ['c', 1], ['a', 2],
               ['d', 4], ['b', 4], ['g', 2]]

token_winner = [0, 0, 0, 0] # 1, 2, 3, 4
lastoccurence = 0
for i in range(len(fixed_game_b0_1)):
     if fixed_game_b0_1[i][0] == "a":
          lastoccurence = i
token_winner[fixed_game_b0_1[lastoccurence][1]] += 1
#we get the element fixed_game_b0_1[lastoccurence][1] and we add 1 to it, like #you said. We got two indexes here : fixed_game_b0_1[lastoccurence][1]
# because you got lists in a list : fixed_game_b0_1[i][0] = the letter and
# fixed_game_b0_1[i][1] = the corresponding number

Не стесняйтесь, если у вас есть какие-либо вопросы! ;)

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