相关疑难解决方法(0)

抑制字符串处理为可迭代

更新:

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, …

python string iterable python-3.x

14
推荐指数
2
解决办法
5033
查看次数

用他们的变音符号编码阿拉伯字母(如果存在)

我正在开展一个深度学习项目,我们使用RNN.我想在数据馈送到网络之前对数据进行编码.输入是阿拉伯语经文,其变音符号在Python中被视为单独的字符.如果跟随它的字符是变音符号,我应编码/表示带有数字的字符,否则我只编码字符.

这样做对数以百万计的诗句,希望能使用lambdamap.但是,我不能一次迭代两个字符,即希望:

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 INT63A HEX - 1594 INT641 HEX - 1601 INT64A HEX - …

python lambda python-3.x

11
推荐指数
1
解决办法
375
查看次数

Python - 字符串中的字符数增加1

我已经在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)

有没有办法做到这一点?

python chr ord

7
推荐指数
2
解决办法
1万
查看次数

Python:字符串中的替换大写和小写

我想将字符串的字符从小写更改为大写.

我的代码如下,我的代码输出是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)

python string lowercase python-2.x uppercase

5
推荐指数
1
解决办法
2万
查看次数

如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

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)

python iteration list-comprehension

5
推荐指数
1
解决办法
2855
查看次数

"无法连接'str'和'int'对象"错误

当我尝试运行以下代码时,我不断收到"无法连接'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)

python string for-loop

3
推荐指数
1
解决办法
788
查看次数