найти каждый третий экземпляр определенного значения в списке - PullRequest
0 голосов
/ 28 мая 2018

У меня есть список python, содержащий сотни целых чисел от 1 до 6 включительно.По сути, я хочу создать функцию, которая находит индексы каждого третьего экземпляра 6. Рассмотрим этот пример:

l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]

6_finder(l)
> [26, 33]

В этом примере третий экземпляр 6 встречается с индексом 26, следующийТретий экземпляр 6 встречается с индексом 33.

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

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

Я бы сделал это так, что немного более обобщенно:

l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]

def val_finder(arr, val):
    res = []
    for i in range(0,len(arr)):
        if arr[i] == val:
            res.append(i)
    return res

vals = val_finder(l, 6)
print(vals)
print(vals[2::3])
0 голосов
/ 28 мая 2018

Вот функция, которая добивается цели.

In [13]: def get_every_3rd_instance(mylist, item):
    ...:     count = 0
    ...:     idx_list = []
    ...:     for idx, i in enumerate(mylist):
    ...:         if i == item:
    ...:             count += 1
    ...:             if count == 3:
    ...:                 idx_list.append(idx)
    ...:                 count = 0
    ...: 
    ...:     return idx_list

In [14]: get_every_3rd_instance(l, 6)
Out[14]: [26, 33]
0 голосов
/ 28 мая 2018

дайте мне знать, если это не работает для вас

import numpy as np
sixes = np.where(l=6)
l_sixes = l[sixes]
for i in range(len(3,l_sixes,3)):
    print (l_sixes)
0 голосов
/ 28 мая 2018

Найти все экземпляры 6 и получить каждый 3 rd .

l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]

res = [i for i, x in enumerate(l) if x == 6][2::3]
print(res)

, который печатает

[26, 33]

Пояснение @ BrettBeatty :

Итерирование по enumerate дает как index, так и value.Понимание списка затем использует value, чтобы проверить, является ли оно 6, и если да, возвращает index.Затем эти собранные индексы нарезаются, начиная с третьего элемента (index 2) с шагом 3.


Как правило, все это можно аккуратно упаковать в функцию, которая возвращаетсписок с индексом каждого k th экземпляра n:

def get_index_of_kth_n(lst, n, k=1):
    return [i for i, x in enumerate(lst) if x == n][k-1::k]

, который также обрабатывает угловых случаев , таких как:

  • lst передано пусто
  • n не появляется в lst
  • n появляется меньше k раз в lst

Во всех вышеперечисленных случаях возвращается пустой список ([]).Отрицательные значения k не поддерживаются.

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