【问题标题】:Need to arrange tuples in a list as per another list tuple indices需要根据另一个列表元组索引在列表中排列元组
【发布时间】:2018-11-19 02:42:47
【问题描述】:
Source = [('A','B','IP1','N1'),('K','G','IP2','N2'),('K','L','IP3','N3') ('W','T','IP4','N4') ]
Target = [('B','A','IP5','N5'), ('T','W','IP6','N6')]

在这里您可以观察到Target 列表的每个元组中的第一个两个字符与Source 元组相反,所以我需要将Target 列表设为

Re_Target = [('B','A','IP5','N5'),('G','K'),('L','K') ('T','W','IP6','N6')]

这里Re_Target 列表索引的第一个和最后一个元组与 Source 的第一个和最后一个元组相同,因为它看起来像反向组合,如果没有反向组合,则添加没有 'IP' 和 'N' 的反向元组就像('K','G','IP2','N2'),('K','L','IP3','N3') -> ('G','K'),('L','K')

注意:不应该使用嵌套的 for 循环或 itertools,因为它对于我的数据非常慢,它将有 7000 个元组,并代替“A”、“B”、“K”、“G”。 . 它可以是任何东西。

【问题讨论】:

标签: python python-3.x list tuples list-comprehension


【解决方案1】:

看起来目标是找到不在Target 元组中的反向Source 元组(前两个字符),并将它们添加。你可以先得到反转的、两个字符的Source元组和未反转的Target元组:

source_tuples = set([s[:2][::-1] for s in Source])
target_tuples = set([t[:2] for t in Target])

然后您可以通过取差来识别哪些元组不在Target 列表中,然后将它们添加到Target 列表中。

missing_target_tuples = list(source_tuples - target_tuples)
Target.extend(missing_target_tuples)

看起来需要对它们进行排序,因此可以将其重新分配给 Re_Target 时的最后一步。

Re_Target = sorted(Target)

完整代码:

Source = [('A','B','IP1','N1'),('K','G','IP2','N2'),('K','L','IP3','N3'), ('W','T','IP4','N4') ]
Target = [('B','A','IP5','N5'), ('T','W','IP6','N6')]
source_tuples = set([s[:2][::-1] for s in Source])
target_tuples = set([t[:2] for t in Target])
missed_target_tuples = list(source_tuples - target_tuples)
Target.extend(missed_target_tuples)
Re_Target = sorted(Target)

print(Re_Target)
# [('B', 'A', 'IP5', 'N5'), ('G', 'K'), ('L', 'K'), ('T', 'W', 'IP6', 'N6')]

【讨论】:

  • 你好,源和结果有不同的索引,但我希望索引相同
  • 这一定意味着可以有多个元组实例,例如('A','B','IP1','N1') 和('A','B','IP2','N2')。那是对的吗?否则,这将导致源和结果具有相同的索引。
  • 来源 = [('32892', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113', 'HRSNNJAQ-vMME-01', '10.88.162.81', 'EKRGMD92' -vMME-02', '10.88.159.113'), ('32890', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113', 'HRSNNJAQ-vMME-01', '10.88.162.81', 'EKRGMD92-vMME-02', '10.88.159.113'), ('32838', '32891', 'HRSNNJAQ-vMME-02', '10.88.163.113', 'HRSNNJAQ-vMME-01', '10.88.162.81' ', 'EKRGMD92-vMME-02', '10.88.159.113')]
  • Re_Target = [('32891', '32838'), ('32891', '32890'), ('32891', '32892')]
  • 嗨,感谢您的回答,我已经添加了几行以使答案正确并发布解决方案
【解决方案2】:

我知道了,现在结果是正确的:

def take_first(elem):
    return(elem[0], elem[1])
def take_second(elem):
    return(elem[1], elem[0])
Source = [('A','B','IP1','N1'),('K','G','IP2','N2'),('K','L','IP3','N3'), ('W','T','IP4','N4') ]
print(sorted(Source, key=take_second))
Target = [('B','A','IP5','N5'), ('T','W','IP6','N6')]
source_tuples = set([s[:2][::-1] for s in Source])
target_tuples = set([t[:2] for t in Target])
missed_target_tuples = list(source_tuples - target_tuples)
Target.extend(missed_target_tuples)
Re_Target = sorted(Target, key=take_first)
print(Re_Target)

这里我添加了两个函数:

def take_first(elem):
    return(elem[0], elem[1])
def take_second(elem):
    return(elem[1], elem[0])

并将这些函数作为 sorted() 的关键

sorted(Source, key=take_second)
Re_Target = sorted(Target,key=take_first)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2021-07-14
    • 2022-01-18
    • 2022-01-24
    • 2014-09-17
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多