如何根据给定的位置显示值列表?

How to display a list of values according to the positions given?

假设我有一串随机生成的值,

string = 'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ'

还有一些位置作为元组列表,

pxn = [(2, 10), (13, 20)]

其中元组表示字符串的开始和结束位置。

我一直在尝试编写一个函数,根据给定的位置 return 分割字符串,所以它看起来像那样

segment = ['lgKgIvhPG','fDtmaXjt']

我已经尝试过这样做了,

def find_region(string):
    " function that returns the string in segments by starting and ending positions provided" 
    for code, start, end in list:
        if index.string == start:
            if index.string == end:
                return code

这显然行不通,但我真的不知道如何继续。

编辑: 假设 string 和 pxn 是存在于字典中的键,看起来像这样

{'string':'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ', 'pxn': [(2, 10), (13,20)]} 

然后将如何解决这个问题?任何帮助将非常感激。谢谢。

您可以使用带有列表理解的字符串切片来生成所需的输出:

[string[start - 1:end] for start, end in pxn]

这输出:

['lgKgIvhPG', 'fDtmaXjt']

你可以用这个。

string = 'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ'
pxn = [(2, 10), (13, 20)]

segments = [string[start:end] for start,end in pxn]
print(segments)

输出

['gKgIvhPG', 'DtmaXjt']

由于python中的编号从0开始,这意味着0指向列表的第一个索引。 但是如果你想让 1 指向列表的第一个索引,那么你可以使用这个。

string = 'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ'
pxn = [(2, 10), (13, 20)]

segments = [string[start-1:end] for start,end in pxn]
print(segments)
    

但是,如果用户提供的值小于零 (0) 或大于字符串的长度,则需要小心。那么这个代码不能完美运行那么你需要使用这个。

string = 'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ'
pxn = [(2, 10), (13, 20)]

segments = [string[start:end] for start,end in pxn if start>=0 and end<len(string)]
print(segments)

通过链接功能。希望对理解需要的语句流有用:

  • 将间隔转换为切片对象
  • 将切片应用于字符串(字符串支持 list-like 访问值)

需要 itertools.starmap 才能正确“提供”slice 函数的参数。

import itertools as it

string = 'ZlgKgIvhPGClfDtmaXjtqQMohOiNZuGaKwSyKsHAcAmpfDXOTUZIfwOvmlotZrquFDFvIvOZ'
pxn = [(2, 10), (13, 20)]

slices = map(string.__getitem__, it.starmap(slice, pxn))

print(list(slices))
# ['gKgIvhPG', 'DtmaXjt']

备注:由于字符串的长度被定义为len = end - start,因此与子字符串的starting/ending点的概念不匹配。在这种情况下,pxn 可以被预处理:

...
x, y = zip(*pxn)
x = map(int(1).__rsub__, x)

slices = map(string.__getitem__, it.starmap(slice, zip(x, y)))