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

如何创建一个列表,其中只添加python中相邻索引唯一的字母?,python,python-3.x,list,indexing,spyder,Python,Python 3.x,List,Indexing,Spyder,我创建了一个函数,随机生成字母a、b、c和d的列表。我想创建一个与第一个列表相同的新列表,但删除了与前一个字母/项目相同的任何字母/项目。我遇到的问题是指列表中的前一封信 例如,如果: 字母表=['a'、'a'、'a'、'b'、'b'、'a',b'] 那么输出应该是, 非完美主义者=['a'、'b'、'a'、'b'] 问题是nodupeletterlist与letterlist相同,这意味着它不会删除与上一个相同的项,因为我得到的函数引用letterlist中的前一项是错误的。我尝试过使用ind

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

例如,如果:

字母表=['a'、'a'、'a'、'b'、'b'、'a',b']

那么输出应该是,

非完美主义者=['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)

使用letterlist.indexletter-1的方式存在的问题是list.indexarg返回列表中第一次出现的arg的索引,在本例中为字母。这意味着,如果您有list=[a,b,a],并且运行list.indexa,它将始终返回0。 删除连续重复的字母的一种方法是:

NodeUpEletterList.appendletterlist[0] 对于范围1中的idx,lenletterlist: 如果字母列表[idx]!=信单[idx-1]: nodupeletterlist.appendletterlist[idx] 您可以使用:

根据评论中的要求,不使用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)
您还可以使用以下方法稍微简化随机生成器:

或使用:

这样做:

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将创建一个只有唯一值的集合,然后列表将其转换回包含值的列表,而不进行任何重复


我希望这有帮助…

以下是我的想法。使用random.choices会比下面的更好,但想法是一样的。不涉及itertools



您能提供您的输入和输出示例以及出错的地方吗?没有示例输入/输出,rdmlist每次运行时都会创建一个新的字母列表。问题是创建的noduperlettlelist应该与创建的lettlelist相同,但删除了与lettlelist中的上一项相同的任何项;相反,实际情况是noduperletterlist和letterlist是相同的。@Darelharth,您想从列表中删除重复的项目吗?如果列表的第一个和最后一个元素相同,您的工作解决方案将失败,因为在迭代的第一步中,您将第一个字母与索引0-1处的字母进行比较,这是-1,因此是最后一个字母。只需在['a'、'b'、'b'、'a']中尝试,它返回['b'、'a'],而不是['a'、'b'、'a']。除非您打算这样做,否则这是错误的。您可以通过先用第一个字符填充NodeUpEletterList,然后在字母[1:]上运行迭代来修复您的解决方案,类似于我建议的解决方案。此外,在枚举中使用start=1。如果第一个字母组是重复的对(如[a,a,b,b]),那么它将丢失第一个字母组。它将以[b]而不是[a,b]结尾。这也会删除第一个字母,但我尝试稍微更改它,并且似乎没有删除第一个字母。对于索引,枚举字母列表中的字母:如果字母!=letterlist[index-1]:nodupletterList.appendletterThis忽略第一个字母,即对['a','b','b','a']给出错误的结果。@darelharth您可以创建一个虚拟元素作为第一个元素,就像enumerate[None]+letterlist[1:],1:中的i,字母一样,然后它应该按预期工作。这会删除连续重复的字母,但它也会删除第一个字母。不会的,第一个字母将始终由NodeUpEletterList添加。appendletterlist[0]。这将只存储每个字母一次,因此对于['a','b''a','a','b'],它将返回['a','b'],而不是['a','b','a','b']。@JanChristopherasa,从这个问题我了解到这些值不应该重复,这就是我提出这个解决方案的原因……引用一下:我想创建一个新的列表,它与第一个列表相同,但删除了与前一个字母/项目相同的任何字母/项目。@JanChristofterasa,是的,我也在试着绕着它转,但问题是,如果我们删除重复的元素,这两个列表不会保持不变,而且也没有提供用于处理的示例输入/输出:如果有不需要导入的解决方案,我宁愿使用“避免导入”。非常感谢您简化我的随机字母生成器,但我不知道random.choice。因为random和itertools模块都是标准库的一部分,所以它们应该在任何地方都可以使用,除了专门的自定义Python安装。但我明白你的意思。这能解决你的问题吗?我不能让它工作,但我可能做错了什么。我收到以下错误:AttributeError:module'itertools
“没有属性”格劳比。哦,该死,这是个打字错误,修好了。我还添加了一个非itertools解决方案。k代表k,这让我有一分钟感到困惑@JanChristofterasa发现了这一点。这忽略了第一个字母。如果你愿意回敬我的话:-当然可以顺便说一句,我没有投你反对票——我只是因为语法对我来说很有趣才发表评论。我从没想过你会这么做。我也只是对那些明显错误/没有回答问题的答案投反对票,如果答案正确/简洁,我会很乐意投反对票。
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)]
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])
>>> 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']