Попробуйте:
batch = {this_k:[tuple(map(float, v)) for k, *v in d if k == this_k] for this_k in set([n[0] for n in d])}
Вывод:
{'1': [(0.1, 0.2, 73.0), (0.11, 0.1, 101.0)], '2': [(0.23, 0.01, 17.0), (0.12, 0.15, 23.0), (1.2, 2.3, 22.0)]}
Как это работает:
Мы делаем set
из всех ключей, которые мы захотим (set([n[0] for n in d])
- [n[0] for n in d]
означает, что у нас есть только список первого элемента в каждом подсписке).
Затем мы выполняем итерацию по каждому ключу (for this_k in ...
).
Для создания элементов для словаря мы используем this_k:[tuple(map(float, v)) for k, *v in d if k == this_k]
Первый бит (this_k
) сообщает Python ключ, который мы хотим (элемент из нашего набора, по которому мы перебираем). Второй бит - это то, что мы хотим, чтобы значение было.
for k, *v in d
означает итерацию по каждому элементу в d (мы говорим Python поместить первое значение [наш ключ для словаря] в k
, чтобы упаковать другие значения в v
, чтобы у нас теперь был наш ключ и наше значение).
Далее мы проверяем, является ли k
правильным ключом (помните, мы создаем этот список соответствующих строк для каждого ключа в d
). Это делается с помощью if k == this_k
.
. Затем мы создаем карту для преобразования всех наших значений в v
в числа с плавающей запятой (map(float, v)
), а затем преобразуем объект карты в tuple
из плавает.
Надеюсь, в этом есть какой-то смысл:)