如何制作两个列表并根据另一个列表删除元素?

时间:2021-03-28 02:56:46

标签: python list

我有三个列表。 两个字符串列表和一个浮点列表。我使用 zip 来匹配一个字符串列表,并将长度相同的浮动在一起以创建一个新字符串。基本上:

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']
letnum = [i for i in zip(letters1, numbers)]

这让我: [('a', 0.0), ('b', 3.0), ('c', 5.0), ('d', 10.0), ('e', 28.0)]

我想使用另一个列表只获取 [0.0, 5.0, 28.0],但我不知道如何返回这样的浮点数列表。

我尝试使用 [x for x in letnum if x in letters2],但它给了我 []

我也知道 letnum = [i for _, i in zip(letters1, numbers)] 会让我获得 [0.0, 3.0, 5.0, 10.0, 28.0],但我不知道这是否有任何作用。

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

letnum 中的每个元素都是一个元组,它是一对字母和一个浮点数。 如果您取元组的第一个元素,然后检查 letters2 列表中是否存在,您将找到匹配项。

[x for x in letnum if x[0] in letters2] 

x[0] 取元组的第一个元素。

答案 1 :(得分:1)

如果您预计会有大列表,这里有一个使用查找字典的线性解决方案,可以在恒定时间内为 letters2 中的每个元素获取浮点数,而不是在嵌套循环中重复迭代。总时间复杂度为 O(len(letters) + len(letters2)),这是最优的:

>>> letters1 = ['a', 'b', 'c', 'd', 'e']
>>> numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
>>> letters2 = ['a', 'c', 'e']
>>> lookup = {x: y for x, y in zip(letters1, numbers)}
>>> [lookup[x] for x in letters2 if x in lookup]
[0.0, 5.0, 28.0]

您最初的尝试不起作用的原因是 [x for x in letnum if x in letters2] 试图在 x 中查找仅包含字符串的完整元组 letters2

答案 2 :(得分:1)

您是否会尝试以下操作:

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']

d = {}
for i in range(len(letters1)):
    d[letters1[i]] = numbers[i]
letnum = [d[x] for x in letters2]
print(letnum)

输出:

[0.0, 5.0, 28.0]

答案 3 :(得分:1)

让我们一下子考虑整个过程(因为我误解了需求而略有编辑)

for 我们通过 letternumberzip ping 在一起得到的 letters1numbers 对中的每一个,我们想要: number,但只有 if letterin letters2

所以,我们完全这样写,只是元素描述放在前面。

[number for letter, number in zip(letters1, numbers) if letter in letter2]

涵盖您的尝试:

<块引用>

我尝试使用 [x for x in letnum if x in letters2],但它给了我 []

是的,因为 x 是这些对之一,而 letters2 不包含这些对。您可以通过提取字母 x[0] 进行比较来解决这个问题,如@vaichidrewar 的回答。同样,x 是一对之一,您只需要数字,因此 x[1] 提取数字。

<块引用>

我也知道 letnum = [i for _, i in zip(letters1, numbers)] 会得到 [0.0, 3.0, 5.0, 10.0, 28.0] 但我不知道这是否有任何作用。

这是一个开始,从某种意义上说,您正在对 zip 结果使用解包,为您获得的每对元素赋予单独的名称。按照惯例,我们使用 _ 来引用我们不关心的值;但您确实关心这两个值(因为您需要条件的字母)。

答案 4 :(得分:0)

zip object 转换为 list 并使用 0, 2, 5 访问 range(0, len(numbers), 2) 索引

letters1 = ['a', 'b', 'c', 'd', 'e']
numbers = [0.0, 3.0, 5.0, 10.0, 28.0]
letters2 = ['a', 'c', 'e']
letnum = [list(zip(letters1, numbers))[i] for i in range(0,len(numbers), 2)]

print(letnum)

方法 2

letnum = [i for i in zip(letters1, numbers) if i[0] in letters2]