python中的动态切片

python中的动态切片,python,string,python-3.x,slice,Python,String,Python 3.x,Slice,我有一个Python 3.x脚本,它只有以下功能: from random import random def slicer(longitude): alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = "" x = 0 for i in range(1, int(longitude)): x = int(62 * random(

我有一个Python 3.x脚本,它只有以下功能:

from random import random

def slicer(longitude):
    alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = ""
    x = 0

    for i in range(1, int(longitude)):
        x = int(62 * random())
        if x == 0:
            x += 1
        else:
            # get a random letter from alphabet, seem this is the problem > (alphabet[x:1]):
            string_section = alphabet[x:1]
            result = result + string_section
    return result

print(str(slicer(10)))  # get a 10 digit string
但是这个密码不起作用,我被卡住了

是否允许
s[x:1]
,其中
x
是for循环的一个变化值


如果没有,是否有其他方法可以达到相同的结果?谢谢您的帮助。

如果您想获取一个不需要切片的字符,只需使用
字母表[x]
进行简单的索引,您就可以在
字母表
中的任意位置
x
访问单个字符,只需使用
字母表[x]
。请注意,
x
必须在
[0,len(字母表)-1]
范围内才能成为有效索引,因此在将随机值转换为整数作为索引时,您可能希望使用
math.floor
而不是
int

或者,您可以使用
random.choice
来选择
经度
次数:

result = ''
for i in xrange(longitude):
    result += random.choice(alphabet)
return result

问题是
x
几乎总是小于1,因此
[x:1]
是一个无意义的范围。如果我这样做:

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alphabet[32:1]
我可以看到python没有返回任何内容。因此,您的脚本不停地向
结果添加任何内容
——您需要的是
字母表[x]
从字母表中占据该位置。由于
字母表[0]
a
,如果x是0,则不需要添加1。(在您的实现中,您永远不会返回“a”,而“b”出现的可能性大约是任何其他字母的两倍)

但是

如果要确保不重复字母,可以使用
random.sample()


记住,在python切片中,如果a和b都是非负的,那么mylist[a:b]应该有b>a。负索引x被映射到(len(mylist)+x),因此它们从末尾开始计数。输出应该是一个随机字符串,使用函数中提供的字母表包含n个数字。我知道这可以通过另一种方法实现,但我特别想使用这种方法。奇怪的是,脚本没有显示任何错误,只是一个空结果。哦!因此,问题实际上是字母[x:1],将其更改为:字母[x:x+1]……谢谢!我从Pythonnull(None)或empty(“”)开始。从技术上讲,它是通过使用长度为1的切片(
alphabet[x:x+1]
)来解决的,但这有点误导。您并不是要获取长度恰好为1的切片,而是要获取单个元素。这样编码可能更好,这样任何阅读代码的人都能从你的选择中看出你只是想得到一件物品。由于
alphabet[x]
是有效的,并且它没有请求超出iterable对象索引范围的切片的缺陷,因此在这种情况下更简单、更容易理解。
from random import random

def slicer(longitude):
    alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = ""
    x = 0

    for i in range(1, int(longitude)):
        x = int(62 * random())
        string_section = alphabet[x]
        result = result + string_section
    return result

print(str(slicer(10)))  # get a 10 digit string
import random

def slicer(longitude):
    alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = random.sample(alphabet,longitude)
    return result

print(''.join(slicer(10)))  # Produces a list, use .join() to print a string