Как добавить несколько значений для ключа dict? - PullRequest
0 голосов
/ 27 сентября 2018
    def chunk(it, size):
        it = iter(it)
        return iter(lambda: tuple(islice(it, size)), ()) 

    Results = []
    values = list(df['values'])
    name = list(df['name'])

    mergedata = {name_: counts_ for name_, counts_ in zip(name, list(chunk(values, 20)))}
    print(mergedata)

    for name_, counts in mergedata.items():
        if all( 5 < values_ < 16 for values_ in counts ):
            Results.append(f'{name_} passed.\n')
        else:
            Results.append(f'{name_} failed.\n')

У меня есть скрипт, который читает два столбца из файла CSV.«Имя» и «Значение».Затем, основываясь на значениях, он дает пропуск или неудачу, если все значения для этого человека равны [5,16].Но команда chunk дает мне только последнее значение.Например: «Ник: 5» и «Дэн: 4».Каждому человеку присвоено 20 ценностей.Чего мне не хватает в моем коде?

chunk (values, 20) # Куски и распечатки 20 случайных значений для первого отдельного (Ника) Пример: Nick: 9,3,5,2,6,7, ..... chunk (values,1) # Блок и выводит последнее значение для всех людей: например: «Ник: 5» и «Дан: 4».

. Name Values Nick 4 Nick 14 Nick 6 Nick 4 Nick 11 Nick 17 Nick 19 ... ... James 12 James 4 James 1 James 2 James 5 ... ...

Цель: {Ник: 4,14, 6,4,11,17,19 ...} Джеймс: {Джеймс: 12,4,1,2,5, ...}

Вывод: Ник не удалось (из-за 17 и 19)Джеймс прошел

1 Ответ

0 голосов
/ 27 сентября 2018

Если вы обрабатываете столбцы в виде имен с накопленными значениями, рассмотрите defaultdict.

Учитывая

import itertools as it
import collections as ct


pred = lambda x : 5 < x < 16

# Sample data (bad + good)
values = list(range(-10, -5)) + list(range(6, 11))
names = ["Nick"] * 5 + ["James"] * 5

Код

def make_dict(names, values):
    """Return a defaultdict of names and listed values."""
    data = ct.defaultdict(list)
    for name, value in zip(names, values):
        data[name].append(value)
    return data


def process_dict(data, pred):
    """Return a list of strings; pass if values satisfy the predicate."""
    result = []
    for name, counts in data.items():
        if all(pred(v) for v in counts):
            result.append(f"{name} passed.\n")
        else:
            result.append(f"{name} failed.\n")
    return result

Демо

d = make_dict(names, values)
d
# defaultdict(list, {'Nick': [-10, -9, -8, -7, -6], 'James': [6, 7, 8, 9, 10]})

process_dict(d, pred)
# ['Nick failed.\n', 'James passed.\n']

Подробности

  • мы используем примеры данных имен и значений
  • make_dict() возвращает словарь пар имя-значение.defaultdict создает пустой список, если ключ отсутствует, поэтому мы можем безопасно добавлять значения без KeyError;это устраняет разбиение на фрагменты.
  • process_dict() проверяет передачу данных с использованием предиката.Предикат - это функция, которая возвращает True или False в зависимости от условия, например, 5 < x < 16.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...