Dict понимание синтаксиса для вложенного списка? - PullRequest
1 голос
/ 29 января 2020

Как можно выполнить следующую процедуру, используя диктовку? load_sample возвращает вложенный список, который, как предполагается, go, в диктовку, где первый столбец представляет группу (1 или 2).

#test.txt structure 

1, 0.1, 0.2, 73
1, 0.11, 0.1, 101
2, 0.23, 0.01, 17
2, 0.12, 0.15, 23
2, 1.2, 2.30, 22



def load_sample(filename):
    with open(filename, 'r') as h:
        sample = [line.split(',') for line in h]
    return sample

batch = {}
d = load_sample("test.txt")
for line in d:
    key = line[0]
    if key not in batch:
        batch[key] = []
    batch[key] += [(float(line[1]), float(line[2]), float(line[3]))] 

1 Ответ

2 голосов
/ 29 января 2020

Попробуйте:

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 из плавает.

Надеюсь, в этом есть какой-то смысл:)

...