用Python中另一个列表中的项目替换满足某些条件的列表元素

时间:2018-07-30 18:53:21

标签: python

假设我有两个列表

a=[0,1,6,4,2,8] 
b=[10,20,30,40]

我想用列表b中的项目替换列表a中0到4之间的元素。

换句话说,我的输出应该是

[10,20,6,30,40,8]

请注意,从本质上讲,我们将满足特定条件的元素 strip 列表a替换为列表b中的一项。 (保持b的顺序)

编辑

我实际上知道列表a中正好有N个项目满足条件。然后我需要用另一个大小为N的列表b“替换”这些位置。

6 个答案:

答案 0 :(得分:4)

考虑到您的编辑,我建议您使用此简单易读的for循环。

a=[0,1,6,4,2,8] 
b=[10,20,30,40]
upper_bound = 4
lower_bound = 0
exclusions = range(lower_bound,upper_bound+1)

for index,item in enumerate(a):
  if item in exclusions:
    a[index] = b.pop(0)

print(a)
>>>>[10, 20, 6, 30, 40, 8]

基本上,这里我要遍历a列表的副本,一旦找到指定范围内的项目,就会弹出b的第一个元素,将其反馈回{ {1}}。

重要提示

重要的是要理解我使用了a列表,我同意在您的特定情况下可以省略该列表,以便允许某人将exclusions对象添加到列表中并且仍然具有相同的行为。显然,您可以使用类似的

string

由于您没有创建不必要的列表,因此这对于您的特定案例将更为有效。


要回答@Julian的问题,假设您的列表成为if item > lower_bound and item < upper_bound 个对象,

string

而不是将a=['a','b','c','d','e','f'] b=['test','test','test','test'] 替换为0,而不是将4替换为c。对于我的解决方案,它会像这样

f

使用@Julian答案,

exclusions = ['c','d','e','f']

for index,item in enumerate(a):
    if item in exclusions:
    a[index] = b.pop(0)

print(a)
>>>>['a', 'b', 'test', 'test', 'test', 'test']

现在,正如他所说,b_iter = iter(b) print([item if item < 0 or item > 4 else b_iter.next() for item in a]) >>>> TypeError: '<' not supported between instances of 'str' and 'int' >运算符可用于比较两个字符串,所以我的意思是他可以将其比较更改为<类型,

string

那仍然是完全错误的,因为在OP的问题中,将b_iter = iter(b) print([item if item < '0' or item > '4' else b_iter.next() for item in a]) >>>>['a', 'b', 'c', 'd', 'e', 'f'] int以外的对象与float<进行比较是没有意义的。

此外,当您使用其他类型时,它变得更加明显

>

现在,我不知道他会如何按照他的逻辑去解决这个问题。

因此,正如我所说,在他的评论部分中,请确保了解他的回答所暗示的含义。

答案 1 :(得分:0)

您可以这样做。

1 1 150
1 3 75

应该起作用。

答案 2 :(得分:0)

您可以在列表b上使用一个计数器,并使用if语句仅替换小于4的数字:

a=[0,1,6,4,2,8]
b=[10,20,30,40]
n=0

for i in range(len(a)):
    if a[i] <= 4 and a[i] >= 0:
        a[i] = b[n]
        n += 1

答案 3 :(得分:0)

我认为这对您来说是更紧凑,更易读的代码。

a = [0, 1, 6, 4, 2, 8]
b = [10, 20, 30, 40]

temp = b
c = []
for item in a:
    if 0 <= item <= 4:
        c.append(temp.pop(0))
    else:
        c.append(item)

print(c)

答案 4 :(得分:0)

您可以使用列表推导和迭代器在两行中完成此操作:

>>> b_iter = iter(b)
>>> [item if item < 0 or item > 4 else b_iter.next() for item in a]
[10, 20, 6, 30, 40, 8]

这全部是假设您假设a包含N个项,其中0 < item < 4,并且b的长度也正好是N

此方法对于此处获得最高评价的答案有两个好处:

  1. 不需要exclusions列表,这只是浪费内存。
  2. 这不会修改a列表,如果这不是您要执行的操作,则可能导致问题。

答案 5 :(得分:-1)

解决此问题的主要概念是遍历列表a,检查每个值是否达到特定条件(在这种情况下,介于0和4之间),如果是,则将该值替换为来自b。您可以使用for循环和if语句来实现此目的。

for i in range(len(a) + 1):   # where a is your first list
    if a[i]==1: #checking a specific index of the list
        a[i] = 10
    elif a[i] == 2:
        a[i] = 20
    elif a[i] == 3:
        a[i] == 30
    elif a[i] == 4:
        a[i] == 40
    else:
        continue

希望有帮助。