如何创建一个列表,其中只添加python中相邻索引唯一的字母?

2024-09-30 04:26:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个函数,随机生成字母“a”、“b”、“c”和“d”的列表。我想创建一个与第一个列表相同的新列表,但删除了与前一个字母/项目相同的任何字母/项目。我遇到的问题是指列表中的前一封信

例如,如果:

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

那么输出应该是,

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

问题是nodupeletterlist与letterlist相同,这意味着它不会删除与上一个相同的项,因为我得到的函数引用letterlist中的前一项是错误的。我尝试过使用index和enumerate,但显然我用错了,因为我没有得到正确的结果。下面是我目前的尝试

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)

编辑: 这就是我最后使用的。我使用这个解决方案仅仅是因为我了解它是如何工作的。下面的答案可能会提供更简洁的解决方案

    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

Tags: in列表forindexif字母randompass
3条回答

您可以使用^{}

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)

您还可以使用^{}稍微简化随机生成器:

import random

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

或使用^{}

import random

start, end = ord('a'), ord('d')
letterlist = [chr(random.randint(start, end)) for _ in range(20)]

这是我想到的。使用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']
for i, letter in enumerate(([None]+letterlist)[1:], 1):
    if letter != letterlist[i-1]:
        nodupeletterlist.append(letter)

相关问题 更多 >

    热门问题