Необходимо упорядочить кортежи в списке согласно другим индексам кортежей списка - PullRequest
0 голосов
/ 19 ноября 2018
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')]

Здесь 1-йи последние кортежи из списка списков Re_Target такие же, как 1-й и последний кортежи источника, так как это выглядит как обратная комбинация, и если нет обратной комбинации, добавьте реверс без 'IP' и 'N' в кортеже, как для('K','G','IP2','N2'),('K','L','IP3','N3') -> ('G','K'),('L','K')

Примечание: не следует использовать вложенные для цикла или itertools, так как это очень медленно для моих данных, которые будут иметь 7000 кортежей, и вместо 'A', 'B', 'K', 'G', .. это может быть что угодно.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я получил его, и теперь результаты верны:

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)
0 голосов
/ 19 ноября 2018

Похоже, цель состоит в том, чтобы найти перевернутые кортежи Source (первые два символа), которых нет в кортежах Target, и добавить их.Сначала вы можете получить наборы перевернутых двухсимвольных 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')]
...