Как выбрать определенные элементы x-кортежа, возвращаемого функцией? - PullRequest
2 голосов
/ 01 октября 2009

Я новичок в Python. Рассмотрим функцию str.partition(), которая возвращает 3-кортеж. Если меня интересуют только элементы 0 и 2 этого кортежа, каков наилучший способ выбрать из этого кортежа только определенные элементы?

В настоящее время я могу сделать либо:

# Introduces "part1" variable, which is useless
(part0, part1, part2) = str.partition(' ')

Или:

# Multiple calls and statements, again redundancy
part0 = str.partition(' ')[0]
part2 = str.partition(' ')[2]

Я бы хотел сделать что-то , как это, но не могу:

(part0, , part2) = str.partition(' ')
# Or:
(part0, part2)   = str.partition(' ')[0, 2]

Ответы [ 5 ]

13 голосов
/ 01 октября 2009

Подчеркивание часто используется как название для вещей, которые вам не нужны, поэтому что-то вроде этого будет работать:

part0, _, part2 = str.partition(' ')

В данном конкретном случае вы можете сделать это, но это не очень хорошее решение:

part0, part2 = str.partition(' ')[::2]

Более эзотерическое решение:

from operator import itemgetter
part0, part2 = itemgetter(0, 2)(str.partition(' '))
4 голосов
/ 01 октября 2009

Правильно, вы не можете вынуть несколько специальных элементов из списка кортежей за один раз.

part0, part1, part2 = str.partition(' ')

Это путь. Не беспокойтесь о части 1, если она вам не нужна, она вам не нужна. Обычно это называют «фиктивным» или «неиспользованным», чтобы показать, что он не используется.

Вы МОЖЕТЕ быть безобразным с:

part0, part2 = str.partition(' ')[::2]

В этом конкретном случае, но это запутывает и не приятно по отношению к другим. ;)

2 голосов
/ 01 октября 2009

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

Pythonic способ получить несколько строк матрицы

NumPy предоставляет вам синтаксис среза, который вы хотите извлечь из различных элементов, используя кортеж или список индексов, но я не думаю, что вы захотите преобразовать ваш список строк в массив numpy.array, чтобы извлечь несколько элементов так что, возможно, вы могли бы написать помощник:

def extract(lst, *indices):
    return [lst[i] for i in indices]

item0, item2 = extract(str.partition(' '), 0, 2)
1 голос
/ 01 октября 2009

Вы также можете использовать str.split(' ', 1) вместо str.partition(' ')

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

0 голосов
/ 01 октября 2009

Вот как бы я это сделал:

all_parts = str.partition(' ')
part0, part2 = all_parts[0], all_parts[2]
...