【问题标题】:slicing dynamically in python在python中动态切片
【发布时间】:2014-03-18 11:37:00
【问题描述】:

我有一个 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 循环的变化值?

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

【问题讨论】:

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

标签: python string python-3.x slice


【解决方案1】:

您可以从alphabet 随机位置x 访问单个字符,只需使用alphabet[x]。请注意,x 必须在[0, len(alphabet)-1] 范围内才能成为有效索引,因此在将随机值转换为整数以用作索引时,您可能希望使用math.floor 而不是int

或者,您可以将random.choice 用于longitude 的次数:

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

【讨论】:

    【解决方案2】:

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

    alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    alphabet[32:1]
    

    我可以看到 python 什么也没返回。因此,您的脚本不断地向result 添加任何内容——您需要的是alphabet[x] 从字母表中获得该位置。由于alphabet[0]a,如果x 为0,则不需要加1。(在您的实现中,您永远不会返回“a”,而“b”出现的可能性大约是出现的两倍任何其他字母)。

    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
    

    但是....

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

    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
    

    【讨论】:

      【解决方案3】:

      如果您尝试获取不需要切片的单个字符,则简单的索引就可以做到alphabet[x]

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2017-09-03
        • 2019-04-13
        • 1970-01-01
        相关资源
        最近更新 更多