我有三个列表。 两个字符串列表和一个浮点列表。我使用 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]
,但我不知道这是否有任何作用。
任何帮助将不胜感激!
答案 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
我们通过 letter
将 number
和 zip
ping 在一起得到的 letters1
和 numbers
对中的每一个,我们想要: number
,但只有 if
letter
是 in 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]