Частичный список распаковывает в Python

Проблема была в localhost, все работает на сервере, спасибо :)

41
задан baduker 25 March 2018 в 23:01
поделиться

10 ответов

# this will result in a="length" and b="25"
a, b = "length=25".partition("=")[::2]

# this will result in a="DEFAULT_LENGTH" and b=""
a, b = "DEFAULT_LENGTH".partition("=")[::2]
48
ответ дан Chris Upchurch 27 November 2019 в 00:13
поделиться

Это может быть бесполезен для вас, если вы не используете Python 3. Однако для полноты стоит отметить, что представленная там расширенная распаковка кортежей позволяет вам выполнять такие действия:

>>> a, *b = "length=25".split("=")
>>> a,b
("length", ['25'])
>>> a, *b = "DEFAULT_LENGTH".split("=")
>>> a,b
("DEFAULT_LENGTH", [])

Т.е. распаковка кортежей теперь работает аналогично как это происходит при распаковке аргументов, поэтому вы можете обозначить «остальные элементы» с помощью * и получить их в виде (возможно, пустого) списка.

Разделение, вероятно, лучшее решение для того, что вы делаете однако.

58
ответ дан Peter Mortensen 27 November 2019 в 00:13
поделиться

Это немного лучше, чем ваше решение, но все же не очень элегантно; меня не удивит, если есть лучший способ сделать это.

a, b = (string.split("=") + [None])[:2]
7
ответ дан Adam Rosenfield 27 November 2019 в 00:13
поделиться

Самый хороший способ - использовать метод строки разбиения :

Разбейте строку при первом появлении sep и верните 3-кортеж, содержащий часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, вернуть 3-кортеж, содержащий саму строку, за которой следуют две пустые строки.

Новое в версии 2.5.

>>> inputstr = "length=25"
>>> inputstr.partition("=")
('length', '=', '25')
>>> name, _, value = inputstr.partition("=")
>>> print name, value
length 25

Он также работает для строк, не содержащих = :

>>> inputstr = "DEFAULT_VALUE"
>>> inputstr.partition("=")
('DEFAULT_VALUE', '', '')

Если по какой-то причине вы используете версию Python до 2.5, вы можете использовать нарезку списка, чтобы сделать то же самое, хотя и немного менее аккуратно:

>>> x = "DEFAULT_LENGTH"

>>> a = x.split("=")[0]
>>> b = "=".join(x.split("=")[1:])

>>> print (a, b)
('DEFAULT_LENGTH', '')

.. и когда x = "length = 25 ":

('length', '25')

Легко превращается в функцию или лямбду:

>>> part = lambda x: (x.split("=")[0], "=".join(x.split("=")[1:]))
>>> part("length=25")
('length', '25')
>>> part('DEFAULT_LENGTH')
('DEFAULT_LENGTH', '')
6
ответ дан dbr 27 November 2019 в 00:13
поделиться

Вы можете написать вспомогательную функцию для этого.

>>> def pack(values, size):
...     if len(values) >= size:
...         return values[:size]
...     return values + [None] * (size - len(values))
...
>>> a, b = pack('a:b:c'.split(':'), 2)
>>> a, b
('a', 'b')
>>> a, b = pack('a'.split(':'), 2)
>>> a, b
('a', None)
4
ответ дан FogleBird 27 November 2019 в 00:13
поделиться

Но иногда я не знаю размер списка справа, например, если я использую split ()

Да, когда у меня есть дела с пределом> 1 (поэтому я не могу использовать раздел), я обычно добавляю:

def paddedsplit(s, find, limit):
    parts= s.split(find, limit)
    return parts+[parts[0][:0]]*(limit+1-len(parts))

username, password, hash= paddedsplit(credentials, ':', 2)

( parts [0] [: 0] есть чтобы получить пустой 'str' или 'unicode', совпадающий с тем, который произвел разделение. Вы можете использовать None, если хотите.)

1
ответ дан Peter Mortensen 27 November 2019 в 00:13
поделиться

Вы пробовали это?

values = aString.split("=")
if len(values) == 1:
   a = values[0]
else:
   a, b = values
-2
ответ дан S.Lott 27 November 2019 в 00:13
поделиться

Было предложено много других решений, но я должен сказать, что самым простым для меня остается

a, b = string.split("=") if "=" in string else (string, None)
0
ответ дан dF. 27 November 2019 в 00:13
поделиться

Для изменения автора (или коммиттера) потребуется переписывая всю историю. Если вы согласны с этим и считаете, что оно того стоит, вам следует проверить git filter-branch . Страница man содержит несколько примеров, с которых можно начать. Также обратите внимание, что вы можете использовать переменные среды, чтобы изменить имя автора, коммиттера, даты и т. Д. - см. «Переменные среды» так что вы можете спокойно сделать

a,b = unpack_re.match(x).groups()
0
ответ дан NickZoic 27 November 2019 в 00:13
поделиться

Don't use this code, it is meant as a joke, but it does what you want:

a = b = None
try: a, b = [a for a in 'DEFAULT_LENGTH'.split('=')]
except: pass
0
ответ дан 27 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

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