Форматирование dict.items () для wxPython - PullRequest
2 голосов
/ 26 октября 2008

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

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

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

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

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

Есть предложения?


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

BC 45
CHM 25
CMP 30

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

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

Ответы [ 6 ]

4 голосов
/ 26 октября 2008

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

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

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))
0 голосов
/ 18 ноября 2008

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

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

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

0 голосов
/ 26 октября 2008

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

0 голосов
/ 26 октября 2008

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

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

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

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

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

0 голосов
/ 26 октября 2008
text_for_display = '\n'.join(item + u' ' + unicode(value) for item, value in my_dictionary.items())
0 голосов
/ 26 октября 2008

Может быть, модуль pretty print поможет:

>>> import pprint
>>> pprint.pformat({ "my key": "my value"})
"{'my key': 'my value'}"
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...