Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建两个列表并基于另一个列表删除元素?_Python_List - Fatal编程技术网

Python 如何创建两个列表并基于另一个列表删除元素?

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

我有三张单子。 两个字符串列表和一个浮点列表。我使用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.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]