Отобразите два списка в один единственный список словарей

У вас есть 2 варианта.

1) переместите команду к объектам, находящимся в сетке, чтобы у каждого из них была отдельная копия команды, и ее выполнение зависит от свойств объекта

2) добавьте свойства «CanXXXX» в ваши объекты и используйте Style.DataTrigger для отключения кнопки в каждом ряду

Второй будет занимать гораздо меньше памяти, но меньше MVVMy

6
задан jfs 17 November 2008 в 23:29
поделиться

8 ответов

Вот является zip путем

def mapper(keys, values):
    n = len(keys)
    return [dict(zip(keys, values[i:i + n]))
            for i in range(0, len(values), n)]
13
ответ дан 8 December 2019 в 04:56
поделиться

zip почти делает то, что Вы хотите; к сожалению, вместо того, чтобы циклически повторить более короткий список, это повреждается. Возможно, существует связанная функция, которую это циклически повторяет?

$ python
>>> keys = ['name', 'age']
>>> values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
>>> dict(zip(keys, values))
{'age': 42, 'name': 'Monty'}

/ РЕДАКТИРОВАНИЕ: О, Вы хотите список dict. Следующие работы (благодаря Peter, также):

from itertoos import cycle

keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]

x = zip(cycle(keys), values)
map(lambda a: dict(a), zip(x[::2], x[1::2]))
2
ответ дан 8 December 2019 в 04:56
поделиться

Немой путь, но тот, который прибывает сразу по моему мнению:

def fields_from_list(keys, values):
    iterator = iter(values)
    while True:
        yield dict((key, iterator.next()) for key in keys)

list(fields_from_list(keys, values)) # to produce a list.
2
ответ дан 8 December 2019 в 04:56
поделиться

Это не симпатично, но здесь является остротой с помощью понимания списка, zip и продвижения:

[dict(zip(keys, a)) for a in zip(values[::2], values[1::2])]
3
ответ дан 8 December 2019 в 04:56
поделиться

В ответе Konrad Rudolph

zip почти делает то, что Вы хотите; к сожалению, вместо того, чтобы циклически повторить более короткий список, это повреждается. Возможно, существует связанная функция, которую это циклически повторяет?

Вот путь:

keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
iter_values = iter(values)
[dict(zip(keys, iter_values)) for _ in range(len(values) // len(keys))]

Я не назову это Pythonic (я думаю, что это слишком умно), но это могло бы быть тем, что ищет.

Нет никакого преимущества в циклическом повторении keys использование списка itertools.cycle(), потому что каждый обход keys соответствует созданию одного словаря.

Править: Вот иначе:

def iter_cut(seq, size):
    for i in range(len(seq) / size):
        yield seq[i*size:(i+1)*size]

keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
[dict(zip(keys, some_values)) for some_values in iter_cut(values, len(keys))]

Это - намного больше pythonic: существует читаемая служебная функция с ясной целью, и остальная часть кода течет естественно от нее.

2
ответ дан 8 December 2019 в 04:56
поделиться

Вот мой простой подход. Это, кажется, близко к идее, что @Cheery имел за исключением того, что я уничтожаю входной список.

def pack(keys, values):
  """This function destructively creates a list of dictionaries from the input lists."""
  retval = []
  while values:
    d = {}
    for x in keys:
      d[x] = values.pop(0)
    retval.append(d)
  return retval
1
ответ дан 8 December 2019 в 04:56
поделиться

Еще одна попытка, возможно, более немая, чем первая:

def split_seq(seq, count):
    i = iter(seq)
    while True:
        yield [i.next() for _ in xrange(count)]

>>> [dict(zip(keys, rec)) for rec in split_seq(values, len(keys))]
[{'age': 42, 'name': 'Monty'},
 {'age': 28, 'name': 'Matt'},
 {'age': 33, 'name': 'Frank'}]

Но Вам решать ли это является более немым.

1
ответ дан 8 December 2019 в 04:56
поделиться
[dict(zip(keys,values[n:n+len(keys)])) for n in xrange(0,len(values),len(keys)) ]

UG-LEEE. Я не хотел бы видеть код, который похож на это. Но это выглядит правильным.

def dictizer(keys, values):
   steps = xrange(0,len(values),len(keys))
   bites = ( values[n:n+len(keys)] for n in steps)
   return ( dict(zip(keys,bite)) for bite in bites )

Все еще немного ужасный, но имена помогают понять его.

0
ответ дан 8 December 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: