Форматирование dict.items() для wxPython

У меня есть текстовое поле в wxPython, которое принимает вывод словаря.items() и отображает его пользователю по мере добавления элементов в словарь. Однако необработанные данные очень уродливы, выглядя как

[(u'BC',45)
(u'CHM',25)
(u'CPM',30)]

Я знаю, чтоdiction.items() — это список кортежей, но я не могу понять, как сделать хороший формат, который также совместим с методом SetValue() wxPython.

Я пробовал перебирать список и кортежи. Если я использую оператор print, вывод будет в порядке. Но когда я заменяю оператор print на SetValue(), кажется, что он получает только последнее значение каждого кортежа, а не оба элемента в кортеже.

Я также пытался создать строку и передать эту строку в SetValue(), но, опять же, я могу получить только один элемент в кортеже или другой, а не оба.

Какие-либо предложения?


Редактировать: Да, я передаю результаты Dictionary.items() в текстовое поле в приложении wxPython. Вместо того, чтобы иметь результаты, подобные приведенным выше, я просто ищу что-то вроде:

BC 45
CHM 25
CMP 30

Ничего особенного, просто вытаскивание каждого значения из каждого кортежа и создание визуального списка.

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


person crystalattice    schedule 26.10.2008    source источник
comment
мне не совсем понятно. Вы пытаетесь отобразить значения в текстовом поле? И если да, то как бы выглядело красивое форматирование?   -  person derfred    schedule 26.10.2008


Ответы (5)


Нет встроенного метода словаря, который вернул бы желаемый результат.

Однако вы можете достичь своей цели, создав вспомогательную функцию, которая будет форматировать словарь, например:

def getNiceDictRepr(aDict):
    return '\n'.join('%s %s' % t for t in aDict.iteritems())

Это даст вам точный желаемый результат:

>>> myDict = dict([(u'BC',45), (u'CHM',25), (u'CPM',30)])
>>> print getNiceDictRepr(myDict)
BC 45
CHM 25
CPM 30

Затем в коде приложения вы можете использовать его, передав его в SetValue:

self.textCtrl.SetValue(getNiceDictRepr(myDict))
person DzinX    schedule 26.10.2008

Возможно, поможет модуль красивой печати:

>>> import pprint
>>> pprint.pformat({ "my key": "my value"})
"{'my key': 'my value'}"
>>> 
person derfred    schedule 26.10.2008

используйте форматирование% (известное в C как sprintf), например:

"%10s - %d" % dict.items()[0]

Количество % спецификаций преобразования в строке формата должно совпадать с длиной кортежа, в случае dict.items() — 2. Результатом оператора форматирования строки является строка, поэтому ее использование в качестве аргумента для SetValue() не проблема. Чтобы перевести весь dict в строку:

'\n'.join(("%10s - %d" % t) for t in dict.items())

Типы преобразования формата указаны в документе.

person gimel    schedule 26.10.2008

Эти данные намного лучше отображаются в виде таблицы/сетки.

person Ali Afshar    schedule 26.10.2008

Я нашел «лучший» способ форматирования вывода. Как обычно, я пытался уничтожить его, когда подойдет более элегантный метод.

for key, value in sorted(self.dict.items()):
    self.current_list.WriteText(key + " " + str(self.dict[key]) + "\n")

Этот способ также сортирует словарь в алфавитном порядке, что очень помогает при идентификации элементов, которые уже были выбраны или использованы.

person crystalattice    schedule 18.11.2008