Как я могу проверить, существует ли какой-либо обратный элемент в списке dict, не зацикливаясь на нем

1

Мой список похож на

l1 = [ {k1:v1} , {k2:v2}, {v1:k1} ]

Есть ли лучший способ проверить, имеет ли какой-либо словарь в списке обратную пару?

  • 0
    Что у тебя сейчас есть?
  • 1
    Что вы подразумеваете под «обратной парой»?
Показать ещё 2 комментария
Теги:
list
dictionary
reverse

2 ответа

1
Лучший ответ

Этот код работает без цикла:

k1 = 'k1'
k2 = 'k2'
v1 = 'v1'
v2 = 'v2'
l1 = [ {k1:v1} , {k2:v2}, {v1:k1} ]

kv = [e.items()[0] for e in l1]
print(kv)

vk = [(v, k) for (k, v) in kv]
print(vk)

result = [(k, v) for (k, v) in kv if (k, v) in vk]
print(result)
  • 0
    да вроде бы - но хорошее решение 1 строка etration :)
  • 2
    Я бы предложил vk = set ((v, k) для (k, v) в kv), чтобы избежать сложности O (n ^ 2)
Показать ещё 2 комментария
3

Я бы предложил преобразовать словари в кортеж и поместить кортеж в набор. И посмотрите в наборе, если обратный кортеж находится в наборе. Это будет иметь сложность O (n) вместо O (n ^ 2).

  • 0
    Ой, извините за мой ранее (удаленный) комментарий, я неправильно понял вопрос. +1
  • 1
    Если вы просто хотите узнать, существует ли обратная пара или нет, то вы можете проверить ее с помощью len(d) != len(set([frozenset(i) for i in d.items()])) . Я думаю, это то, что предлагает Ксавье.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню