如何在python中基于给定条件组合列表的两个元素

如何在python中基于给定条件组合列表的两个元素,python,Python,我想根据python中给定的条件将两个元素组合在一个列表中 例如,如果我在列表中遇到字符“a”,我希望将其与下一个元素组合。名单如下: ['a', 'b', 'c', 'a', 'd'] 变成 ['ab', 'c', 'ad'] 有什么快速的方法可以做到这一点吗 我想到的一个解决方案是创建一个新的空列表并遍历第一个列表。当我们在列表1中遇到元素“a”时,我们将list1[a的索引]和list1[a+1的索引]连接起来,并将结果附加到列表2中。但是,我想知道是否有任何方法可以在不创建新列表并

我想根据python中给定的条件将两个元素组合在一个列表中

例如,如果我在列表中遇到字符“a”,我希望将其与下一个元素组合。名单如下:

['a', 'b', 'c', 'a', 'd'] 
变成

['ab', 'c', 'ad']
有什么快速的方法可以做到这一点吗

我想到的一个解决方案是创建一个新的空列表并遍历第一个列表。当我们在列表1中遇到元素“a”时,我们将list1[a的索引]和list1[a+1的索引]连接起来,并将结果附加到列表2中。但是,我想知道是否有任何方法可以在不创建新列表并将值复制到列表中的情况下执行此操作。

使用列表理解和列表上的迭代器。当当前迭代器对象是
a
时,只需使用
next
将其与迭代器中的下一项连接起来:

l = ['a', 'b', 'c', 'a', 'd']

it = iter(l)
l[:] =  [i+next(it) if i == 'a' else i for i in it]
print l
# ['ab', 'c', 'ad']

这是一个简单的方法。Mb不是肾盂道

l1 = ['a', 'b', 'c', 'a', 'd']

do_combine = False
combine_element = None
for el in l1:
    if do_combine:
        indx = l1.index(el)
        l1[indx] = combine_element + el 
        do_combine = False
        l1.remove(combine_element)
    if el == 'a':
        combine_element = el
        do_combine = True

print(l1)
    # ['ab', 'c', 'ad']

这不会创建新列表,只会修改现有列表

l = ['a', 'b', 'c', 'a', 'd']
for i in range(len(l)-2, -1, -1):
    if l[i] == 'a':
        l[i] = l[i] + l.pop(i+1)
print(l)

如果您不想使用列表理解创建新列表(可能是因为您的输入列表太大),您可以修改列表:

i=0
while i < len(l):
 if l[i]=='a':
  l[i] += l.pop(i+1)
  i += 1
i=0
而我
好吧,如果您不太想创建一个新列表,那么我们来:

from itertools import islice

a = list("abcdabdbac")

i = 0
for x, y in zip(a, islice(a, 1, None)):
    if x == 'a':
        a[i] = x + y
        i += 1
    elif y != 'a':
        a[i] = y
        i += 1

try:
    del a[i:]
except:
    pass

您可以使用
itertools.groupby
和groupby:

  • 字母紧跟在a之后或
  • 字母不是
    a
使用
enumerate
生成当前索引,该索引允许从列表中获取上一个元素(创建一个新列表,但只创建一个线性列表)

结果:

['ab', 'c', 'ad']

您可以使用您的算法动态修改列表。列表理解是创建一个新列表,因此与用户的要求相矛盾,而不创建一个新列表@EyuelDK那么,对于原始列表的完整切片分配,它仍然会创建一个新列表,但您只是将元素重新分配给切片。它仍然没有修改到位。总而言之,如果您使用的是列表理解,那么它就是在创建一个新列表。@EyuelDK取决于在此上下文中创建一个新列表的真正含义。您在解决方案中使用的
范围
在Python2中创建了一个新列表。在Python2.7中,您是对的,但我认为这与此问题无关。这意味着用户不想创建原始列表的新列表,我对range的使用与此无关-可以通过使用Python 3或while语句来修复,这不是问题。但是你要做的是创建一个新的列表,然后重新分配到原来的列表-只是用一种奇特的语法。这就是我认为它不符合要求的原因。优雅的解决方案,但您没有显示代码的关键部分:开始时
I
初始化为什么?您缺少
I++
简单地说,您的代码不工作。再次感谢!在我这方面粘贴坏拷贝。请注意,尽管python没有
++
操作符,但您必须使用
i+=1
['ab', 'c', 'ad']