如何在python中将for循环转换为理解列表?

时间:2017-06-02 08:55:16

标签: python python-2.7

我有这段代码:

 unique_char = np.zeros(26,dtype=np.int); 
    for char in s1:
        unique_char[np.int(ord(char)-97)] += 1

这是整个代码:

def check_permutation(str1,str2):

    if str1 is None or str2 is None:
            return False
    if len(str1) != len(str2):
            return False

    s1 = str1.lower()
    s2 = str2.lower()

    unique_char = np.zeros(26,dtype=np.int); 

    for char in s1:
        unique_char[np.int(ord(char)-97)] += 1

    for char in s1:
        unique_char[np.int(ord(char)-97)] -= 1

    for x in unique_char:
        if unique_char[x] != 0:
            return False
    return True

如何将其转换为理解列表?

谢谢!

1 个答案:

答案 0 :(得分:1)

您尚未提供s1的示例,因此我使用了自己的示例。从您的代码开始:

import numpy as np

s1='teststring'

unique_char = np.zeros(26, dtype=np.int)

for char in s1:
    unique_char[np.int(ord(char) - 97)] += 1

我们得到了一个numpy数组的结果

[0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 2 3 0 0 0 0 0 0]

如果您真的想将其作为列表理解,您可以执行以下操作:

unique_char = [sum(1 for c in s1 if ord(c)-97 ==i) for i, x in enumerate(unique_char)]

哪会返回表单列表的结果:

[0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0]

但是,如果要计算字符串中的字符数,最有效的方法是使用计数器。

from collections import Counter

unique_char = Counter(s1)

这将返回以下形式的字典子类:

Counter({'t': 3, 's': 2, 'e': 1, 'g': 1, 'i': 1, 'n': 1, 'r': 1})

要将此应用于提供的示例,您可以为每个字符串创建Counter,然后检查每个字符串是否返回相同的值:

from collections import Counter

def check_permutation(str1,str2):
    if str1 is None or str2 is None:
        return False
    if len(str1) != len(str2):
        return False

    s1 = Counter(str1.lower())
    s2 = Counter(str2.lower())

    all_chars = set(s1.keys() + s2.keys())

    for k in all_chars:
        if s1.get(k, 0) != s2.get(k, 0):
            return False

    return True

print check_permutation('test', 'tset')
print check_permutation('test', 'tsat')
print check_permutation('test', 'tttt')

打印:

True
False
False