在词典列表中过滤唯一组合

时间:2019-05-15 19:51:24

标签: python python-2.7 list dictionary

因此,我得到了充满字典的列表,其中有两个名称(name00和name01)。这些是链接集群的名称,并且总是有所有组合可用。可以从2个或更多簇中创建组合,结果变量中可以有更多组合。

在此示例中,我将具有3个不同名称(1、2、3)和2个不同名称(4、5)的群集链接在一起,但是可以更多。

我需要过滤结果,以便仅获得唯一的组合(两种方式分别为name00和name01),并且仅针对其中一个群集。例如,如果选择test1作为main,则可以在示例中丢弃test2-test3的组合。

我希望这个例子能使之清楚。

results = [
{ 'name00': 'test1', 'name01': 'test2' },
{ 'name00': 'test1', 'name01': 'test3' },
{ 'name00': 'test2', 'name01': 'test1' },
{ 'name00': 'test2', 'name01': 'test3' },
{ 'name00': 'test3', 'name01': 'test1' },
{ 'name00': 'test3', 'name01': 'test2' },
{ 'name00': 'test4', 'name01': 'test5' },
{ 'name00': 'test5', 'name01': 'test4' }
]

# Desired result

results = [
{ 'name00': 'test1', 'name01': 'test2' },
{ 'name00': 'test1', 'name01': 'test3' },
{ 'name00': 'test4', 'name01': 'test5' }
]

2 个答案:

答案 0 :(得分:1)

所有对都出现在列表中,实现应该足够简单。

对列表进行排序。 “下部”标签将位于前面。特别是,第一个条目将是一个可行的主要元素。将每个此类链接放入结果列表,并跟踪第二个元素。然后跳过以“其他”名称开头的链接。重复此过程,直到您覆盖了整个原始列表。这是一个痛苦的详细版本:

start = [
    { 'name00': 'test1', 'name01': 'test2' },
    { 'name00': 'test1', 'name01': 'test3' },
    { 'name00': 'test2', 'name01': 'test1' },
    { 'name00': 'test2', 'name01': 'test3' },
    { 'name00': 'test3', 'name01': 'test1' },
    { 'name00': 'test3', 'name01': 'test2' },
    { 'name00': 'test4', 'name01': 'test5' },
    { 'name00': 'test5', 'name01': 'test4' }
]

result = []

start.sort(key=lambda link: link["name00"]+link["name01"]) 

for link in start:
    print(link)

link_key = None
pos = 0
while pos < len(start):

    other_name = []

    link = start[pos]
    if not link_key:
        link_key = link['name00']

    # Gather all of the links that start with the lowest name.
    # Keep track of the other names for later use.
    while start[pos]['name00'] == link_key:
        link = start[pos]
        result.append(link)
        other_name.append(link["name01"])
        pos += 1

    # Now is "later" ... ignore all links that start with other names.
    while pos < len(start) and              \
          start[pos]['name00'] in other_name:
        link = start[pos]
        pos += 1

    link_key = None


# Print the resulting pairs
for link in result:
    print(link["name00"], link["name01"])

输出:

test1 test2
test1 test3
test4 test5

答案 1 :(得分:0)

不确定,但这是我的理解:

如果出现以下情况,则结果中的 i j 中的两个元素被认为是相等的:

  • ({primary_colori['name00'] == j['name00'])或
  • ({i['name01'] == j['name01']i['name01'] == j['name00'])。

对吗?

在这种情况下,您可以定义一个键,该键通过对值'name00'/'name01'进行排序进行比较,然后使用该键将所有项存储在字典中以消除重复项。

例如:

i['name00'] == j['name01']

您得到:

def key(item):
    return frozenset([item['name00'], item['name01']])


by_key = {key(item): item for item in results}

pprint.pprint(sorted(by_key.values()))