Можно ли распаковать значения из списка в слайс? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь использовать значения в списке, чтобы выбрать часть слова. Вот рабочее решение:

word = 'abc'*4
slice = [2,5]  #it can contain 1-3 elements

def try_catch(list, index):
    try:
        return list[index]
    except IndexError:
        return None

print(word[slice[0]:try_catch(slice,1):try_catch(slice,2)])

но мне интересно, можно ли его сократить? Нечто подобное приходит мне в голову:

word = 'abc'*4
slice = [2,6,2]
print(word[':'.join([str(x) for x in slice])]) #missing : for one element in list

Производит:

TypeError: string indices must be integers

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Это не питон [slice][1], но вызывает синтаксическую ошибку, потому что [..] синтаксис для получения фрагмента, а не его создания:

slice = [2:5]
Out:
...
SyntaxError

slice - это встроенный Python, поэтому не скрывайте его имя. Создать срез как

my_slice = slice(2, 5, 1)

где первый аргумент - начальное значение, следующий - конечное значение, а последний - размер шага:

my_list = list(range(10))
my_list
Out:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

my_list[my_slice]
Out:
[2, 3, 4]

my_list[slice(3, 8, 2)]
Out:
[2, 4, 6]

Обратите внимание, что мы должны использовать [] со срезом, так как он вызывает __getitem__ метод списка, который принимает slice ojects (смотрите последнюю ссылку для __getitem__ и slice).

0 голосов
/ 15 января 2019

Попробуйте это:

word = 'abc'*4
w = list(word)
s = slice(2,6,2)
print("".join(w[s]))
0 голосов
/ 15 января 2019

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

>>> word = 'abcdefghijk'
>>> theslice = [2, 10, 3]
>>> word[slice(*theslice)]
'cfi'
...