Python 如何创建两个列表并基于另一个列表删除元素?
我有三张单子。 两个字符串列表和一个浮点列表。我使用zip将一个相同长度的字符串和float列表匹配在一起,生成一个新字符串。基本上:Python 如何创建两个列表并基于另一个列表删除元素?,python,list,Python,List,我有三张单子。 两个字符串列表和一个浮点列表。我使用zip将一个相同长度的字符串和float列表匹配在一起,生成一个新字符串。基本上: 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
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代表letnum中的x,如果x代表letters2]
,但这给了我[]
我也知道letnum=[I for,I in zip(letters1,numbers)]
会让我得到[0.0,3.0,5.0,10.0,28.0]
,但我不知道这是否有用
任何帮助都将不胜感激 letnum中的每个元素都是一个元组,它是一对字母和一个浮点。 如果您获取元组的第一个元素,然后检查
letters2
列表中是否存在匹配项
[x for x in letnum if x[0] in letters2]
x[0]
取元组的第一个元素。将zip对象
转换为列表
并使用范围(0,len(数字),2)访问0,2,5
索引
碘甲烷-2
letnum = [i for i in zip(letters1, numbers) if i[0] in letters2]
如果您预期会出现大型列表,那么这里有一个线性解决方案,它使用查找字典,可以在固定时间内为letters2
中的每个元素获取浮点值,而不是在嵌套循环中重复迭代。总时间复杂度为O(len(字母)+len(字母2))
这是最佳的:
>>> 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代表letnum中的x,如果letters2中的x]
尝试在letters2
中查找只包含字符串的整个元组x
。您是否尝试以下操作:
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]
让我们同时考虑整个过程(略微编辑,因为我误解了要求)
对于我们通过zip
将字母1
和数字
ping在一起得到的字母1
和数字
对,我们想要的是数字
,但只有字母
是字母2
时才需要
所以,我们写的完全一样,只是元素描述在前面
[number for letter, number in zip(letters1, numbers) if letter in letter2]
要覆盖您的尝试,请执行以下操作:
我尝试使用[x代表letnum中的x,如果x代表letters2]
,但这给了我[]
是,因为x
是其中一对,而letters2
不包含这些对。您可以在@vaichidrewar的答案中通过提取字母x[0]
进行比较来解决这个问题。类似地,x
是其中一对,您只需要数字,因此x[1]
提取数字
我也知道letnum=[I for I in zip(letters1,number)]会得到[0.0,3.0,5.0,10.0,28.0],但我不知道这是否有用
这是一个开始,从某种意义上说,您正在对zip
结果使用解包来为您得到的每对元素分别命名。按照惯例,我们使用\uu
来表示我们不关心的值;但您确实关心这两个值(因为您需要条件的字母)。@RavinderSingh13感谢您将我指向线程。讨论很难得出结论。我想限制删除/取消删除是一个想法。顺便说一句,你知道,名单上的人并不是唯一过度删除问题的人。
[number for letter, number in zip(letters1, numbers) if letter in letter2]