Ответ 1
Вы можете создать набор кортежей, набор списков невозможен из-за не хэшируемых элементов, как вы упомянули.
>>> l = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
>>> set(tuple(i) for i in l)
{(1, 2, 3), (2, 4, 5)}
У меня есть список таких списков:
i = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
Я хотел бы получить список, содержащий "уникальные" списки (на основе их элементов), например:
o = [[1, 2, 3], [2, 4, 5]]
Я не могу использовать set()
, поскольку в списке есть недопустимые элементы. Вместо этого я делаю это:
o = []
for e in i:
if e not in o:
o.append(e)
Есть ли более простой способ сделать это?
Вы можете создать набор кортежей, набор списков невозможен из-за не хэшируемых элементов, как вы упомянули.
>>> l = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
>>> set(tuple(i) for i in l)
{(1, 2, 3), (2, 4, 5)}
i = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
print([ele for ind, ele in enumerate(i) if ele not in i[:ind]])
[[1, 2, 3], [2, 4, 5]]
Если вы считаете [2, 4, 5]
равным [2, 5, 4]
, вам нужно будет сделать дополнительные проверки
Вы можете преобразовать каждый элемент в кортеж, а затем вставить его в набор.
Вот пример кода с вашим примером:
tmp = set()
a = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
for i in a:
tmp.add(tuple(i))
tmp
будет выглядеть следующим образом:
{(1, 2, 3), (2, 4, 5)}
Вот еще один способ сделать это:
I = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]]
mySet = set()
for j in range(len(I)):
mySet = mySet | set([tuple(I[j])])
print(mySet)