Как удалить лишние ',' в кортеже в Django (Python) - PullRequest
2 голосов
/ 21 мая 2011

У меня есть одна проблема при создании списка идентификаторов с использованием django. если я выберу больше 1 идентификатора, это нормально, но если я выберу только один, это приведет к дополнительному значению ',' в списке.

testa = tuple([k['id'] for k in queryset.values('id')])
print testa

если в наборе запросов есть ровно 1 идентификатор, будет отображаться

(1234,)

кроме этого все нормально

(1234,1244)

Как я могу удалить лишние ', в списке'

Ответы [ 5 ]

11 голосов
/ 21 мая 2011
(1234,)

- правильное представление Python для 1-го кортежа. (1234) было бы неправильно, поскольку в математических скобках это значение принимается за простое целое число, которое оценивается как 1234, а не как кортеж, содержащий его.

Это отличается для списков, потому что квадратные скобки не имеют этой двойной цели и означают также математический порядок операций, поэтому [1234] и [1234,] являются действительными представлениями списка длины-1, текстовое представление по умолчанию может быть без запятой.

Если вы разрабатываете свое собственное текстовое представление кортежа, которое не обязательно должно быть таким же, как в Python, вы можете сделать, например ::

'(%s)' % ', '.join(map(repr, testa))
2 голосов
/ 21 мая 2011

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

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

print testa[0]
>>>> 1234
1 голос
/ 21 мая 2011

Вы говорите, что хотите список, но де-факто вы создаете кортеж.

Чтобы получить список идентификаторов, взгляните на values_list

>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]
>>> Entry.objects.filter(id=1).values_list('id', flat=True)
[1]
1 голос
/ 21 мая 2011

Вот как Python отображает кортежи с одиночными значениями, также обратите внимание, что рекомендуемый синтаксис для создания кортежа с одиночным значением - также x = (1,), который помогает отличить кортеж от вызова функции.Если вы действительно хотите получить результат, подобный описанному, вы можете попробовать

testa = tuple([k['id'] for k in queryset.values('id')])
if len(testa)==1:
     print '(%s)'%testa[0]
else:
     print testa
1 голос
/ 21 мая 2011

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

print "(%s)" % ",".join(testa)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...