Python 如何将元组列表与列表进行内部联接?
我有一个大于150k的元组元素列表,其中包含一个ID的长度为该ID的ID。但是,这个列表应该只显示出现在第二个大于80k的列表中的IDPython 如何将元组列表与列表进行内部联接?,python,python-3.x,list,tuples,inner-join,Python,Python 3.x,List,Tuples,Inner Join,我有一个大于150k的元组元素列表,其中包含一个ID的长度为该ID的ID。但是,这个列表应该只显示出现在第二个大于80k的列表中的ID list_of_tuples = [('1', 31.46), ('10', 97.99), ('50', 71.19), ('100', 17.03), ...] normal_list = ['1', '50', '100', ...] 所需输出为: list_of_tuples = [('1', 31.46), ('50', 71.19), ('100'
list_of_tuples = [('1', 31.46), ('10', 97.99), ('50', 71.19), ('100', 17.03), ...]
normal_list = ['1', '50', '100', ...]
所需输出为:
list_of_tuples = [('1', 31.46), ('50', 71.19), ('100', 17.03), ...]
下面是我为测试这个概念而编写的代码,但由于我是Python新手,它不起作用。我也没有在网上找到解决这类问题的方法
for whole_elem in list_of_tuples:
for first_elem in whole_elem:
for link in normal_list:
if first_elem <> link
list_of_tuples.pop(whole_elem)
我非常感谢你的支持。
多谢各位 您可能可以在概念上解决此问题,其级别与使用pandas函数查看的内部连接相同 然而,在这里,我只想做以下几点:
result = []
normal_set = set(normal_list) # improves performance of 'contains' check from len(normal_list)/2 (on avarage) to log(len(normal_list)
for tpl in list_of_tuples:
if tpl[0] in normal_set:
result.append(tpl)
除此之外,如果不需要将结果作为一个整体使用,则可以生成结果的元素,而不是追加:
def inner_join(normal_list, list_of_tuples):
result = []
normal_set = set(normal_list)
for tpl in list_of_tuples:
if tpl[0] in normal_set:
yield tpl
您将其用作:
for el in innner_join(normal_list, list_of_tuples):
....
您可能可以在概念上解决这个问题,就像使用pandas函数查看内部连接一样 然而,在这里,我只想做以下几点:
result = []
normal_set = set(normal_list) # improves performance of 'contains' check from len(normal_list)/2 (on avarage) to log(len(normal_list)
for tpl in list_of_tuples:
if tpl[0] in normal_set:
result.append(tpl)
除此之外,如果不需要将结果作为一个整体使用,则可以生成结果的元素,而不是追加:
def inner_join(normal_list, list_of_tuples):
result = []
normal_set = set(normal_list)
for tpl in list_of_tuples:
if tpl[0] in normal_set:
yield tpl
您将其用作:
for el in innner_join(normal_list, list_of_tuples):
....
对于整个要素中的第一要素:
整元素中的第一个元素是整元素[0]。因为第一个元素在整个元素中是一个覆盖所有元素的循环
第一要素=整个要素[0]
对于普通_列表中的链接:
如果第一个元素链接
每当normal_列表中有一个元素不等于first_元素时,就会运行if的主体。相反,您需要检查正常列表是否包含第一个元素
如果第一个元素不在正常列表中:
dict_link_length.popwhole_elem
不确定dict\u link\u长度是多少。不过,创建一个新列表可能比修改旧列表更好
过滤=[]
对于元组列表中的整个元素:
第一要素=整个要素[0]
如果正常列表中的第一个元素:
过滤后的。附加完整元素
现在为事物选择更多描述性名称元组列表是一个普通列表。这是一个开始:
选择_id=['1','50','100',…]
过滤=[]
对于项目中的项目:
项目id=项目[0]
如果选择中的项目\u id:
筛选的.appenditem
检查一个元素是否在具有in的列表中是很慢的,因为它必须一次检查一个完整的列表,但检查一个元素是否在集合中是常数时间:
选择_id=['1','50','100',…]
过滤=[]
选择\u id=冻结设置选择\u id
对于项目中的项目:
项目id=项目[0]
如果选择中的项目\u id:
筛选的.appenditem
最后,这可以写成一个列表:
选择\u id=冻结设置选择\u id
筛选=[如果选择标识中的项目[0],则项目中的项目为项目]
对于整个要素中的第一要素:
整元素中的第一个元素是整元素[0]。因为第一个元素在整个元素中是一个覆盖所有元素的循环
第一要素=整个要素[0]
对于普通_列表中的链接:
如果第一个元素链接
每当normal_列表中有一个元素不等于first_元素时,就会运行if的主体。相反,您需要检查正常列表是否包含第一个元素
如果第一个元素不在正常列表中:
dict_link_length.popwhole_elem
不确定dict\u link\u长度是多少。不过,创建一个新列表可能比修改旧列表更好
过滤=[]
对于元组列表中的整个元素:
第一要素=整个要素[0]
如果正常列表中的第一个元素:
过滤后的。附加完整元素
现在为事物选择更多描述性名称元组列表是一个普通列表。这是一个开始:
选择_id=['1','50','100',…]
过滤=[]
对于项目中的项目:
项目id=项目[0]
如果选择中的项目\u id:
筛选的.appenditem
检查一个元素是否在具有in的列表中是很慢的,因为它必须一次检查一个完整的列表,但检查一个元素是否在集合中是常数时间:
选择_id=['1','50','100',…]
过滤=[]
选择\u id=冻结设置选择\u id
对于项目中的项目:
项目id=项目[0]
如果选择中的项目\u id:
筛选的.appenditem
最后,这可以写成一个列表:
选择\u id=冻结设置选择\u id
筛选=[如果选择标识中的项目[0],则项目中的项目为项目]
列表理解在这里不起作用吗
filtered_tuples = [tpl for tpl in list_of_tuples if tpl[0] in normal_list]
由于您的列表非常大,您可能希望将普通的_列表转换为一个集合以提高性能:
normal_set = frozenset(normal_list)
filtered_tuples = [tpl for tpl in list_of_tuples if tpl[0] in normal_set]
列表理解在这里不起作用吗
filtered_tuples = [tpl for tpl in list_of_tuples if tpl[0] in normal_list]
由于您的列表非常大,您可能希望将普通的_列表转换为一个集合以提高性能:
normal_set = frozenset(normal_list)
filtered_tuples = [tpl for tpl in list_of_tuples if tpl[0] in normal_set]
你会考虑使用大熊猫吗?这可能在更短的时间内做到这一点。“超级脑”我做了调整,现在它应该是清楚的它不工作告诉我们什么。在算法复杂度方面,这是否满足您的需求,您将不得不说。你可以通过消耗更多的内存来更快地实现一些事情,例如,你可以将正常的_列表作为dict或。
利用排序。你会考虑使用大熊猫,这可能会在更短的时间内做到这一点吗?@超脑我做了一个调整,现在它应该是清楚的它不工作告诉我们什么。在算法复杂度方面,这是否满足您的需求,您将不得不说。如果您可以将正常的列表作为dict或利用排序,则可以通过消耗更多内存来更快地实现某些功能。感谢您的回答,很抱歉将您与dict\u link\u length混淆,我忘了将其更改为list\u of tuple。感谢您的回答,很抱歉将您与dict\u link\u length混淆,我忘了把它改成元组列表。