更新:
2006年在python.org上提出了使内置字符串不可迭代的想法.我的问题不同之处在于我试图偶尔禁止这个功能; 仍然这整个线程非常相关.
以下是Guido的批评意见,他们str在试验基础上实施了不可迭代的评论:
[...]我实现了这个(这很简单)然后发现我必须修复大量遍布字符串的地方.例如:
sre解析器和编译器使用set("0123456789")之类的东西,并迭代输入regexp的字符来解析它.
difflib有两个字符串列表定义的API(文件的典型逐行差异),或两个字符串(典型的行内差异),甚至两个任何列表(对于广义序列差异) .
optparse.py,textwrap.py,string.py中的小变化.
而且我甚至还没有在regrtest.py框架工作的地方(由于difflib问题).
我放弃了这个项目; 补丁是SF补丁1471291.我不再赞成这个想法; 它只是不实用,而且我在sre和difflib中找到的用例都反驳了迭代字符串的好理由的前提.
原始问题:
虽然字符串的一个简洁功能是字符串是可迭代的,但当与鸭子打字相结合时,它可能会导致灾难:
# record has to support [] operation to set/retrieve values
# fields has to be an iterable that contains the fields to be set
def set_fields(record, fields, value):
for f in fields:
record[f] = value
set_fields(weapon1, ('Name', 'ShortName'), 'Dagger')
set_fields(weapon2, ('Name',), 'Katana')
set_fields(weapon3, 'Name', 'Wand') # I was tired and forgot to put parentheses
Run Code Online (Sandbox Code Playgroud)
除了isinstance(fields, …
我正在开展一个深度学习项目,我们使用RNN.我想在数据馈送到网络之前对数据进行编码.输入是阿拉伯语经文,其变音符号在Python中被视为单独的字符.如果跟随它的字符是变音符号,我应编码/表示带有数字的字符,否则我只编码字符.
这样做对数以百万计的诗句,希望能使用lambda与map.但是,我不能一次迭代两个字符,即希望:
map(lambda ch, next_ch: encode(ch + next_ch) if is_diacritic(next_ch) else encode(ch), verse)
Run Code Online (Sandbox Code Playgroud)
我在这个问题背后的意图是找到实现上述目标的最快方法.对lambda函数没有限制,但for循环答案不是我正在寻找的.
非阿拉伯人的一个接近的例子,假设你想编码以下文字:
XXA)L_I!I%M<LLL>MMQ*Q
Run Code Online (Sandbox Code Playgroud)
如果它是一个特殊字符,你希望在将字母与后面的字母连接后对其进行编码,否则只需对字母进行编码.
输出:
['X', 'X', 'A)', 'L_', 'I!', 'I%', 'M<', 'L', 'L', 'L>', 'M', 'M', 'Q*', 'Q']
Run Code Online (Sandbox Code Playgroud)
对于阿拉伯人:
诗节示例:
"قفانبكمنذكرىحبيبومنزلبسقطاللوىبينالدخولفحومل"
变音符号是字母上方的小符号(即,,)
[更新]
变音符号范围从64B HEX或1611 INT开始,到652 HEX或1618 INT结束.
字母621 HEX - 1569 INT至63A HEX - 1594 INT和641 HEX - 1601 INT至64A HEX - …
我已经在python中搜索了如何做到这一点,我找不到答案.如果你有一个字符串:
>>> value = 'abc'
Run Code Online (Sandbox Code Playgroud)
如何将字符串中的所有字符增加1?所以我正在寻找的输入是:
>>> value = 'bcd'
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用ord和chr用一个角色做到这一点:
>>> value = 'a'
>>> print (chr(ord(value)+1))
>>> b
Run Code Online (Sandbox Code Playgroud)
但ord()与chr()只能采取一个字符.如果我使用上面的相同语句,并且字符串包含多个字符.我会得到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我想将字符串的字符从小写更改为大写.
我的代码如下,我的代码输出是a; 你能告诉我我错在哪里并解释原因吗?提前致谢
test = "AltERNating"
def to_alternating_case(string):
words = list(string)
for word in words:
if word.isupper() == True:
return word.lower()
else:
return word.upper()
print to_alternating_case(test)
Run Code Online (Sandbox Code Playgroud) Stack Overflow 上有很多关于这个一般主题的问答,但它们要么质量很差(通常是初学者的调试问题暗示的),要么以其他方式错过了目标(通常是不够通用)。至少有两种极其常见的方法会使幼稚的代码出错,初学者从关于循环的规范中获益更多,而不是从将问题作为拼写错误或关于打印所需内容的规范中获益。所以这是我尝试将所有相关信息放在同一个地方。
假设我有一些简单的代码,可以对一个值进行计算x并将其分配给y:
y = x + 1
# Or it could be in a function:
def calc_y(an_x):
return an_x + 1
Run Code Online (Sandbox Code Playgroud)
现在我想重复计算 的许多可能值x。我知道for如果我已经有要使用的值列表(或其他序列),我可以使用循环:
xs = [1, 3, 5]
for x in xs:
y = x + 1
Run Code Online (Sandbox Code Playgroud)
while或者,如果有其他逻辑来计算值序列,我可以使用循环x:
def next_collatz(value):
if value % 2 == 0:
return value // 2
else:
return 3 * value + 1
def collatz_from_19():
x = 19
while x != 1:
x …Run Code Online (Sandbox Code Playgroud) 当我尝试运行以下代码时,我不断收到"无法连接'str'和'int'对象"错误.我指出第6行是问题的根源,但我真的看不出错误!我的类型似乎都是一致的.
def DashInsert(num):
num_str = str(num)
new_str = ''
for i in num_str:
var1 = num_str[i:i+1]
var2 = num_str[i+1:i+2]
if var1 % 2 == 1 and var2 % 2 == 1:
new_str = new_str + num_str[i:i+1] + "-"
else:
new_str = new_str + num_str[i:i+1]
return new_str
# keep this function call here
# to see how to enter arguments in Python scroll down
print DashInsert(raw_input())
Run Code Online (Sandbox Code Playgroud)