2016-11-18 3 views
1

私はPythonで辞書を持っている:辞書キーでこの文字列の接頭辞をすばやく解析するにはどうすればよいですか?

dict1 = {'first': 'ABCDE', 'second': 12345, 'third': KITTY , 'four': dogcatbirdelephant, ...} 

を明確にするために、私はデータを解析し、Pythonで辞書に投げています。

私の問題:thirdの値には、それらの接頭辞が付いていることがあります。値KITTYまたはCATの代わりに、A:KITTYまたはK:CATがあります。プレフィックスには任意の文字を使用できますが、プレフィックスには必要な値(たとえばKITTY)を区切ったコロンがあります(A:

ただし、すべての値がこのようなものではありません。実際にはプレフィックスのない文字列です。

これらの辞書の値を解析するには、「コロンの後ろにあるもの」をすべて保存する必要がありますか? for文でチェックしますか? (私はこれを避けることを好むでしょう、かなりのパフォーマンスヒットがあると思います)。

+4

mystring.split( ':')[ - 1] ' –

+0

コロンを最大1つ持つことは保証されていますか?たとえば、値は常に 'b'または' a:b'の形式であり、 'b:c'が必要な場所では決して' a:b:c'ではありません。 – danielunderwood

+0

@PatrickHaughそしてもし ':'がなければ?それは何を返すだろうか? – ShanZhengYang

答えて

1

@パトリックハウの答えは正しいです。あなたのサンプルリストは文字列だけでなく整数も持っているので、あなたはたぶん少しのフィルタリングをしたいでしょう。

"私はデータを解析して辞書に投げかけている"と言うので、別の辞書ではなく、2つのタプルのどこかから来ていると仮定しています。

既にデータが辞書にある場合は、キーをループする必要があります。

#!/usr/bin/env python 

class Kitty(object): 
    def __init__(self): 
     self.d = {} 

    def meow(self, k, v): 
     """check for integers before adding to dictionary""" 
     try: 
      int(v) 
      self.d[k] = v 
     except ValueError: 
      self.d[k] = v.split(":")[-1] 

if __name__ == "__main__": 
    kitty = Kitty() 
    kitty.meow("first", 12345) 
    kitty.meow("second", "A:KITTY") 
    kitty.meow("third", "B:KITTY") 
    kitty.meow("fourth", "C:KITTY") 
    kitty.meow("fifth", "KITTY") 
    kitty.meow("sixty", "kreplach") 

    print(kitty.d) 

これは、その結果:

{'third': 'KITTY', 'second': 'KITTY', 'fourth': 'KITTY', 'sixty': 'kreplach', 'fifth': 'KITTY', 'first': 12345} 

限り、 "効率的" として、それは別の問題です。 Pythonの文字列メソッドは効率的です。データを関数にフィードする方法はあなたの判断です。

+0

もちろん、' '' '' ''を使うのは、タイプをチェックするときに '' 'isinstance'''を使用するよりも、私の馬鹿げたコードを貼り付けないでください! – lysdexia

関連する問題