Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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_Python 3.x_List_Tuples_Inner Join - Fatal编程技术网

Python 如何将元组列表与列表进行内部联接?

Python 如何将元组列表与列表进行内部联接?,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'

我有一个大于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', 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混淆,我忘了把它改成元组列表。