是否可以将值从列表解包到切片?

时间:2019-01-15 16:36:24

标签: python slice unpack

我正在尝试使用列表中的值来选择单词的一部分。这是有效的解决方案:

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 :(得分:4)

您可以使用内置的slice(并且需要使用不同的名称来访问内置列表):

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

答案 1 :(得分:0)

它不是python [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]

请注意,我们应该对切片使用[],因为它调用了接受slice对象的列表的__getitem__方法(请查看__getitem__的最后一个链接和slice)。

答案 2 :(得分:0)

尝试一下:

word = 'abc'*4
w = list(word)
s = slice(2,6,2)
print("".join(w[s]))