Как создать список, который добавляет только буквы, уникальные для смежных индексов в python? - PullRequest
0 голосов
/ 24 февраля 2020

Я создал функцию, которая случайным образом генерирует список букв «a», «b», «c» и «d». Я хотел бы создать новый список, который совпадает с первым списком, но с удалением любых букв / элементов, которые совпадают с предыдущей буквой / элементом. Когда у меня возникают проблемы, я обращаюсь к предыдущей букве в списке.

Например, если:

letterlist = ['a','a','a','b','b','a,',b']

, тогда вывод должен быть,

nondupelist = ['a','b','a','b']

Проблема в том, что nodupeletterlist - это то же самое, что и список писем - то есть он не удаляет элементы, которые совпадают с последним - потому что я получаю функцию ссылки на предыдущий элемент в списке писем неправильно. Я пытался использовать индекс и перечислять, но я, очевидно, использую их неправильно, потому что я не получаю правильные результаты. Ниже моя текущая попытка.

import random

def rdmlist(letterlist, nodupeletterlist):
    for item in range(20):
        rng = random.random()
        if rng < 0.25:
            letterlist.append("a")
        elif 0.25 <= rng and rng < 0.5:
            letterlist.append("b")
        elif 0.5 <= rng and rng < 0.75:
            letterlist.append("c")
        else:
            letterlist.append("d")
    for letter in letterlist:
        if letter != letterlist[letterlist.index(letter)-1]:
            nodupeletterlist.append(letter)
        else:
            pass
    return

letterlist1 = []
nodupeletterlist1 = []
rdmlist(letterlist1, nodupeletterlist1)

РЕДАКТИРОВАТЬ: Это то, что я в конечном итоге использовал. Я использовал это решение просто потому, что понимаю, как оно работает. Ответы ниже могут предоставить более краткие или pythoni c решения.

    for index, letter in enumerate(letterlist, start=0):
        if 0 == index:
            nodupeletterlist.append(letter)
        else:
            pass
    for index, letter in enumerate(letterlist[1:], start = 1):
        if letter != letterlist[index-1]:
            nodupeletterlist.append(letter)
        else:
            pass

Ответы [ 5 ]

2 голосов
/ 24 февраля 2020
for i, letter in enumerate(([None]+letterlist)[1:], 1):
    if letter != letterlist[i-1]:
        nodupeletterlist.append(letter)
1 голос
/ 24 февраля 2020

Вот что я придумал. Использование random.choices() было бы лучше, чем то, что я имею ниже, но та же идея. не включает itertools

>>> li_1 = [random.choice("abcdefg") for i in range(20)]
>>> li_1
['c', 'e', 'e', 'g', 'b', 'd', 'b', 'g', 'd', 'c', 'e', 'g', 'e', 'c', 'd', 
 'e', 'e', 'f', 'd', 'd']
>>>
>>> li_2 = [li_1[i] for i in range(len(li_1)) 
...                                      if not i or i and li_1[i - 1] != li_1[i]]
>>> li_2
['c', 'e', 'g', 'b', 'd', 'b', 'g', 'd', 'c', 'e', 'g', 'e', 'c', 
 'd', 'e', 'f', 'd']
1 голос
/ 24 февраля 2020

Вы можете использовать itertools.groupby:

import itertools

nodupeletterlist = [k for k, _ in itertools.groupby(letterlist)]

Решение без использования itertools, как указано в комментариях:

def nodupe(letters):
    if not letters:
        return []
    r = [letters[0]]
    for ch in letters[1:]:
        if ch != r[-1]:
            r.append(ch)
    return r

nodupeletterlist = nodupe(letterlist)

Фиксированная версия предложенного «рабочего решения»:

def nodupe(letters):
    if not letters:
        return []
    r = [letters[0]]
    r += [l for i, l in enumerate(letters[1:]) if l != letters[i]]
    return r

nodupeletterlist = nodupe(letterlist)

Вы также можете немного упростить свой генератор случайных чисел, используя random.choices:

import random

chars = 'abcd'
letterlist = random.choices(chars, k=20)

или с помощью random.randint:

import random

start, end = ord('a'), ord('d')
letterlist = [chr(random.randint(start, end)) for _ in range(20)]
0 голосов
/ 24 февраля 2020

Сделайте это:

L1 = ['a','a','a','b','b','c','d']
L2 = []
L2.append(L1[0])
for i in range(1,len(L1)):
    if L1[i] != L1[i-1]:
        L2.append(L1[i])

set () создаст набор только с уникальными значениями, затем list () преобразует его обратно в список, содержащий значения без повторений.

Надеюсь, это поможет ...

0 голосов
/ 24 февраля 2020

Проблема с тем, как вы используете letterlist.index(letter)-1, заключается в том, что list.index(arg) возвращает индекс первого вхождения arg в list, в данном случае это буква. Это означает, что если у вас есть list = ["a", "b", "a"] и вы запускаете list.index("a"), он всегда будет возвращать 0. Способ сделать то, что вы собираетесь (удаляя последовательные повторения букв), будет:

nodupeletterlist.append(letterlist[0])
for idx in range(1, len(letterlist)):
    if letterlist[idx] != letterlist[idx-1]:
        nodupeletterlist.append(letterlist[idx])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...