更改列表元素以匹配另一个列表

时间:2019-07-11 12:37:27

标签: python

我正在尝试遍历列表列表,并增加每个子列表中的第一个元素,直到它与另一个列表中的整数匹配为止。

list1=[[2, 13, 22, 40], [8, 13, 22, 40], [24, 13, 22, 40]]
reference_list = [5, 10, 30]
for i in list1: 
    while (i[0] != i) in reference_list:    
        i[0] = i[0] + 1
print(list1)

现在我的输出是:

[[2, 13, 22, 40], [8, 13, 22, 40], [24, 13, 22, 40]]

(什么都没有修改) 我想要的输出是:

[[5, 13, 22, 40], [10, 13, 22, 40], [30, 13, 22, 40]]

(以使第一个整数增加,直到它与reference_list上的整数匹配为止)

我已经涉猎了set函数,但似乎无法正常工作。

任何想法都值得赞赏!

3 个答案:

答案 0 :(得分:2)

这应该可以工作,当您“ while”条件为两个不同的列表使用相同的迭代器

list1=[[2,13,22,40],[8,13,22,40],[24,13,22,40]]
reference_list=[5, 10, 30]
for i in list1:
    while i[0] not in reference_list:
        i[0]=i[0]+1
print(list1)

但是,正如@GrzegorzBokota所说,如果list1的第一个元素大于引用列表中的所有元素,则将有一个无限循环,请小心。

答案 1 :(得分:0)

如果将引用list替换为numpy.array,则可以直接索引下一个较大的元素:

import numpy as np

list1 = [[2,13,22,40],[8,13,22,40],[24,13,22,40]]
reference_list = np.array([5, 10, 30])
for i in list1:
    i[0] = reference_list[reference_list>=i[0]][0]
print(list1)

# [[5, 13, 22, 40], [10, 13, 22, 40], [30, 13, 22, 40]]

请注意,这也不能解决您的引用没有提供最大价值的情况。
但这可以通过检查所有较大值的列表是否为空来解决:

list1 = [[200,13,22,40],[8,13,22,40],[24,13,22,40]]
reference_list = np.array([5, 10, 30])
for i in list1:
    next_bigger = list(reference_list[reference_list>=i[0]])
    if next_bigger:
        i[0] = next_bigger[0]
print(list1)
# [[200, 13, 22, 40], [10, 13, 22, 40], [30, 13, 22, 40]]

答案 2 :(得分:0)

如果要将每个子列表的第一个元素量化为reference_list中的一个条目,则可以通过列表理解来实现:

list1=[[2,13,22,40],[8,13,22,40],[24,13,22,40]]
reference_list=[5, 10, 30]
list1 = [ [next((r for r in reference_list if r>=v[0]),v[0])]+v[1:] for v in list1 ]
print(list1)

您的问题和示例也可以解释为表示参考列表中的每个条目对应于列表列表中相同位置的列表。在这种情况下,您可以使用zip并行遍历两个列表:

list1 = [ [max(r,v[0])]+v[1:] for r,v in zip(reference_list,list1) ]