1

文字列のリストが行内にあるかどうかを確認する方法に関するこの素晴らしい回答を見つけました行にリスト内の文字列のいずれかが含まれている かどうかを確認する方法は?

しかし、辞書のキーで同様のことをしようとしても、私にはうまくいかないようです:

import urllib2

url_info = urllib2.urlopen('http://rss.timegenie.com/forex.xml')
currencies = {"DKK": [], "SEK": []}
print currencies.keys()
testCounter = 0

for line in url_info:
    if any(countryCode in line for countryCode in currencies.keys()):
        testCounter += 1
    if "DKK" in line or "SEK" in line:
        print line
print "testCounter is %i and should be 2 - if not debug the code" % (testCounter)

出力:

['SEK', 'DKK']
<code>DKK</code>
<code>SEK</code>
testCounter is 377 and should be 2 - if not debug the code

おそらく私の問題は、.keys()がリストではなく配列を提供するためだと思います..しかし、それを変換する方法がわかりません..

4

2 に答える 2

5

変化する:

any(countryCode in line for countryCode in currencies.keys())

に:

any([countryCode in line for countryCode in currencies.keys()])

元のコードはジェネレーター式を使用していますが、(私が思うに) あなたの意図はリスト内包表記です。参照:ジェネレータ式とリスト内包表記

更新: pylab をインポートした ipython インタープリターを使用すると、あなたと同じ結果が得られることがわかりました (予想される 2 に対して 377 カウント)。問題は、「any」が配列で動作することを意図した numpy パッケージからのものであることに気付きました。次に、「any」がbuiltinからのものになるように、pylab なしで ipython インタープリターをロードしました。この場合、元のコードは機能します。したがって、ipython インタープリターを使用している場合は、次のように入力します。

help(any)

組み込みモジュールからのものであることを確認してください。その場合、元のコードは正常に動作するはずです。

于 2012-12-28T15:13:40.640 に答える
1

これは、xml ファイルを調べるにはあまり適した方法ではありません。

  1. 遅いです。N が行数、M がキーの数である場合、潜在的に N*M の部分文字列検索を行っています。
  2. XML は行指向のテキスト形式ではありません。部分文字列検索では、属性名や要素名も見つかる可能性がありますが、これはおそらくあなたが望んでいるものではありません。また、XML ファイルのすべての要素が 1 行に空白なしで配置されている場合 (機械で生成および処理された XML では一般的)、予想よりも少ない一致が得られます。

行指向のテキスト入力がある場合は、キーのリストから正規表現を作成することをお勧めします。

import re
linetester = re.compile('|'.join(re.escape(key) for key in currencies))

for match in linetester.finditer(entire_text):
    print match.group(0)

#or if entire_text is too long and you want to consume iteratively:

for line in entire_text:
        for match in linetester.find(line):
            print match.group(0)

ただし、XML があるため、実際の XML プロセッサを使用する必要があります。

import xml.etree.cElementTree as ET

for elem in forex.findall('data/code'):
    if elem.text in currencies:
        print elem.text

どのコードが存在するかだけに関心があり、特定のエントリは気にしない場合は、set Intersection を使用できます。

codes = frozenset(e.text for e in forex.findall('data/code'))

print codes & frozenset(currencies)
于 2012-12-28T15:47:16.357 に答える