turbo pascal 中是否有相当于 ['A'..'Z'] 的 python

问题描述 投票:0回答:4

就像主题一样,是否有一种(快速)方法(可能是一种符号)来达到与 Turbo Pascal 相同的效果,以快速创建包含“A”和“Z”之间的所有元素的列表。

在 Turbo Pascal 中可以写成 ['A'..'Z']

python slice turbo-pascal
4个回答
3
投票

我认为最优雅、最简单、Pythonic 的方法是使用

string
模块:

import string
print(string.ascii_uppercase)
>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
x = list(string.ascii_uppercase)
print(x)
>>> ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

编辑:如果您需要包含非 ASCII 甚至非拉丁字符的语言的字母表,您可以使用

PyICU
(以下是 Windows 用户的安装指南:https://github.com/cgohlke/pyicu -构建)。然后,您就可以运行这个脚本了:

# imports
import locale

from icu import Collator, Locale, LocaleData

# official language name
locale_language, encoding = locale.getlocale()

# alphabet lowercase
locale_alphabet: list = list(LocaleData(locale_language).getExemplarSet())

# alphabet uppercase
locale_alphabet_uppercase: list = list(map(str.upper, locale_alphabet))

# output
print(locale_alphabet_uppercase)

事情是

PyICU
生成未排序的字符列表(在我的例子中 - 波兰语):

>>> ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'W', 'Y', 'Z', 'Ó', 'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ś', 'Ź', 'Ż']

要根据您的语言标准正确对字母进行排序,您可以使用

Collator
中的
PyICU
指定自定义排序键 (https://stackoverflow.com/a/11124645/11485896):

# sorting
collator = Collator.createInstance(Locale(locale_language))

# output
print(sorted(locale_alphabet_uppercase, key = collator.getSortKey))

输出:

>>> ['A', 'Ą', 'B', 'C', 'Ć', 'D', 'E', 'Ę', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'Ń', 'O', 'Ó', 'P', 'R', 'S', 'Ś', 'T', 'U', 'W', 'Y', 'Z', 'Ź', 'Ż']

2
投票

您可以在一系列字符编号上使用地图:

*letters, = map(chr,range(65,91)) # A-Z

print(letters)

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

您可以使用拆包来组合多个范围:

*alphanum, = *map(chr,range(65,91)), *"0123456789", *map(chr,range(97,122))

或者,您可以创建自己的速记函数:

def CHR(a,*b):
    return [*map(chr,range(ord(a[0]),ord(a[-1])+1))] + (CHR(*b) if b else [])

您可以根据需要重复使用:

codeChars = CHR('A..Z','-','0..9')

print(codeChars)

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
 'Y', 'Z', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8',
 '9']

2
投票

不幸的是,在 Python 中没有其他方法可以如此紧凑和优雅地做到这一点。正如@Soren所说,对于字母,您可以使用

string.ascii_uppercase
string.ascii_lowercase
,您可以在其上进行切片。例如,
print(string.ascii_uppercase[3:7])
打印“DEFG”。

如果你想要更通用、更易读并且不限于拉丁字母的东西,你必须编写一个类来实现你想要的。 我写了这个非常简单的示例作为概念证明(它遗漏了许多小细节)。它应该适用于任何可迭代(即使我只用字符串测试过它)。

class Slicer:
    def __init__(self, content):
        self.content = content
    
    def __getitem__(self, key: slice):
        if key.step is not None:
            return self.content[self.content.index(key.start) : self.content.index(key.stop)+1 : key.step]
        return self.content[self.content.index(key.start) : self.content.index(key.stop)+1]
    
    def __repr__(self):
        return f"Slicer({self.content!r})"

import string
letters = Slicer(string.ascii_uppercase)
print(letters)
# Slicer('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
print(letters["A":"H"])
# ABCDEFGH
print(letters["A":"H":2])
# ACEG

如果你想进一步挖掘,它使用Python中的

slice
对象,表示对象序列:https://docs.python.org/3/glossary.html#term-slice

对于数字,您可以使用

range()
函数:
list(range(1, 7))
返回
[1, 2, 3, 4, 5, 6]
(它也支持步骤)。


1
投票

如果您有 icu4c 和 PyICU 可用,则可以使用 Unicode 集构建字符列表:

from icu import UnicodeSet
chars = list(UnicodeSet('[A-Z]'))
print(chars)  
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']                                                          

使用 Unicode 集,可以开发许多更复杂的集。例如,所有大写拉丁字母:

upper_latin = list(UnicodeSet('[[\p{Lu}] & [\p{Script=Latn}]]'))

© www.soinside.com 2019 - 2024. All rights reserved.