Объединение 2 списков, чтобы удалить дубликаты из первого, сохраняя соответствующие значения второго - PullRequest
0 голосов
/ 17 июня 2019

У меня есть два списка, как это:

1stItem version1.1
1stItem version1.2
1stItem version1.3
2ndItem version1.1
2ndItem version1.2
3rdItem version1.1
3rdItem version1.2
3rdItem version1.3
3rdItem version1.4

И я хочу объединить эти 2 списка, удалив дубликаты в первом, сохранив соответствующие значения из второго, так что я получу что-то вродеthis:

1stItem version1.1, version1.2, version1.3
2ndItem version1.1, version1.2
3rdItem version1.1,version1.2,version1.3,version1.4

Попытка получить индекс для всех дублирующихся элементов из 1-го списка, а затем объединить их с соответствующими элементами из 2-го списка с помощью этого:

from collections import defaultdict

def list_duplicates(seq):
    tally = defaultdict(list)
    for i,item in enumerate(seq):
        tally[item].append(i)
    return ((key,locs) for key,locs in tally.items() 
                            if len(locs)>1)

for dup in sorted(list_duplicates(source)):
    print(dup)

У меня естьощущение, что это может быть решено гораздо проще и питонским способом

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Вы можете использовать itertools.groupby , чтобы сгруппировать списки элементов и версий на основе имени элемента и выполнить итерацию по этой группе для создания словаря

from itertools import groupby
from collections import defaultdict

items = ['1stItem' , '1stItem' , '1stItem' , '2ndItem' , '2ndItem' , '3rdItem' , '3rdItem', '3rdItem', '3rdItem' ]
versions = ['version1.1' , 'version1.2' , 'version1.3', 'version1.1' , 'version1.2' , 'version1.1' , 'version1.2', 'version1.3', 'version1.4' ]

d = defaultdict(list)

#Iterate over a zipped list of items and versions and group on item
for model, group in groupby(zip(items,versions), key=lambda x:x[0]):

    #Iterate through the group and form the dictionary
    for key, value in group:
        d[key].append(value)

print(dict(d))

Выход будет

{
'1stItem': ['version1.1', 'version1.2', 'version1.3'], 
'2ndItem': ['version1.1', 'version1.2'], 
'3rdItem': ['version1.1', 'version1.2', 'version1.3', 'version1.4']
}
0 голосов
/ 17 июня 2019

Вы можете использовать словарь, чтобы удалить повторяющиеся значения из первого списка и создать список, чтобы добавить значения во втором списке в качестве значений в словарь

first = ['1stItem', '1stItem', '1stItem', '2ndItem', '2ndItem', '3rdItem', '3rdItem', '3rdItem', '3rdItem' ]
second = ['version1.1', 'version1.2', 'version1.3', 'version1.1', 'version1.2', 'version1.1', 'version1.2', 'version1.3', 'version1.4']
#define dictionary to remove duplicates from first list
d = {i: [] for i in first}
for i in range(len(second)):
    key = first[i]
    d[key].append(second[i])
print("Output")
print(d)
0 голосов
/ 17 июня 2019

Ваш код кажется немного сложным. Я бы предложил сделать это с помощью словаря:

Data = [["1stItem", "version1.1"],
        ["1stItem", "version1.2"],
        ["1stItem", "version1.3"],
        ["2ndItem", "version1.1"],
        ["2ndItem", "version1.2"],
        ["3rdItem", "version1.1"],
        ["3rdItem", "version1.2"],
        ["3rdItem", "version1.3"],
        ["3rdItem", "version1.4"]]


FinalData = {}; # Create dictionary

for Item in Data:

    if not(Item[0] in FinalData.keys()): # If Key does not exist, add it
        FinalData[Item[0]] = [] # Add the key, array as defult value

    FinalData[Item[0]].append(Item[1]) # Add 'Version' to array

for Key in FinalData.keys():

    print("%s %s" % (Key, ", ".join(FinalData[Key]))) # Print the result

Это даст следующий результат:

2ndItem version1.1, version1.2
1stItem version1.1, version1.2, version1.3
3rdItem version1.1, version1.2, version1.3, version1.4

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...