2017-06-02 8 views
0

私は、コードのこの部分を持っている:forループをpythonの理解リストに変換するにはどうしたらいいですか?

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 

私は理解リストにこれを変換することができますどのように?

ありがとうございます!

+2

文字列内の文字の出現回数をカウントしようとしているようです。[Counter](https://docs.python.org/2/library/collections.html#collections.Counter) ? – asongtoruin

+0

完全なコードと入力/出力の説明を貼り付けることはできますか? s1には何がありますか? – papey

+5

できますが、効率的ではありません。カウントするときは、リスト内包を使わないで 'Counter()'を使います。 –

答えて

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 

私たちは、あなたが本当にリストの内包としてそれをやってみたかった場合は、次のような何かを行うことができ

[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] 

のnumpyの配列の結果が得られます。

フォームのリストの結果を返すでしょう
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 
関連する問題