Как вы можете сравнить словарь списка кортежей друг с другом? - PullRequest
1 голос
/ 20 января 2020

Трудно описать вопрос без кода. Вот что мне нужно для помощи:

{'22': [('22_0',['A','B','C','D']),
      ('22_1',['B','C','D','E']),
      ('22_2',['A','B','C'])]


'33': [('33_0',['A','B','C','D']),
      ('33_1',['A','B','C','D']),
      ('33_2',['A','B','C','D'])]}


Should return [False, True], description below.

Я хочу перебрать элементы списка defaultdict и вернуть True, если все 2-е значения вложенных кортежей равны друг другу, в противном случае - False. В списках значений может быть любое количество вложенных кортежей.

Код для словаря выше должен возвращать [False, True].

Любая помощь будет отличной.

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вы можете использовать all () с пониманием списка, чтобы проверить, все ли 2-е значения в кортежах соответствуют 2-му элементу в первом кортеже.

d = {
    '22': [('22_0', ['A', 'B', 'C', 'D']),
           ('22_1', ['B', 'C', 'D', 'E']),
           ('22_2', ['A', 'B', 'C'])],

    '33': [('33_0', ['A', 'B', 'C', 'D']),
           ('33_1', ['A', 'B', 'C', 'D']),
           ('33_2', ['A', 'B', 'C', 'D'])]
}

result = []
for key, value in d.items():
    result.append((key, all([i[1] == value[0][1] for i in value])))
print(result)

В результате я соединяю логическое значение с ключ словаря, к которому он относится, поскольку словари не всегда получают доступ к элементам в ожидаемом нами порядке: [('22', False), ('33', True)]

0 голосов
/ 22 января 2020

Дано

import operator as op


d = {
    "22": [
        ("22_0", ["A", "B", "C", "D"]),
        ("22_1", ["B", "C", "D", "E"]),
        ("22_2", ["A", "B", "C"]),
    ],
    "33": [
         ("33_0", ["A", "B", "C", "D"]),
         ("33_1", ["A", "B", "C", "D"]),
         ("33_2", ["A", "B", "C", "D"]),
    ]
}

Код

def all_equal(seq):
    """Return True if all elements are equal."""
    return len(set(seq)) == 1


def get_items(seq, index=1):
    """Return nested elements at index."""
    idx = op.itemgetter(index)

    return [idx(x) for x in [idx(lst) for lst in seq]]

Демо

[all_equal(get_items(x)) for x in d.values()]

Подробности

Функциональный эквивалент:

def idx_1(seq):
    """Return the element at index 1."""
    return seq[1]


get_items = lambda x: map(idx_1, map(idx_1, x))


second_vals = map(get_items, d.values())
list(map(all_equal, second_vals))
# [False, True]
...