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

时间:2017-04-26 14:58:10

标签: python

我想基于python中的给定条件组合列表中的两个元素。

例如,如果我遇到角色' a'在列表中,我想将它与下一个元素结合起来。清单:

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

成为

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

有没有快速的方法可以做到这一点?

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

6 个答案:

答案 0 :(得分:2)

在列表中使用带有迭代器的列表解析。当前的iteratee为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']

答案 1 :(得分:2)

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

img {
  padding:29px;
  opacity:0;
  width:250px;
  height:250px;
}

div {
  vertical-align:top; 
  width:267px; 
  height:auto;
  display:inline-block; 
  padding:20px; 
  margin:0px;      
  border-radius:10px; 
  border:1px solid;
}

p { 
  margin:5px; 
  padding:3px; 
  background-color:blue; 
  border-radius:8px; 
}

答案 2 :(得分:2)

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

i=0
while i < len(l):
 if l[i]=='a':
  l[i] += l.pop(i+1)
  i += 1

答案 3 :(得分: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

答案 4 :(得分:0)

您可以使用itertools.groupby并分组:

  • 信件跟随a
  • 信不是a

使用enumerate生成当前索引,该索引允许从列表中获取前一个元素(创建一个新列表但是一行)

import itertools

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

print(["".join(x[1] for x in v) for _,v in itertools.groupby(enumerate(l),key=lambda t: (t[0] > 0 and l[t[0]-1]=='a') or t[1]=='a')])

结果:

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

答案 5 :(得分:-1)

这很简单。 Mb不是pythonic方式。

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']