0

私はそのように提示されたテキストを持っています:

text = ["A/abc","B/abd","C/abc","D/xyz"]

私が望む出力は

 mylist1 = ["A","C"]
 mylist2 = ["B"]
 mylist3 = ["D"]

私が探しているタグは「/abc」と「/abd」だけです

今私が持っているものは次のとおりです。

def searchWord(segment):
    word_tag = segment.split('/')

    if re.finditer('ab',word_tag[1]):
        if re.finditer('abc',word_tag[1]):
            letter = word_tag[0]
            mylist1 = letter
        else:
            letter = word_tag[0]
            mylist2 = letter
    else:
        letter = word_tag[0]
        mylist3 = letter

    return mylist1
    return mylist2
    return mylist3

mylist1,mylist2,mylist3 = [searchWord(segment) for segment in text]

正常に動作しているように見えますが、例外がスローされます。

 ValueError: too many values to unpack.

「テキスト」リストがかなり大きいのですが、これが問題でしょうか? このプロセスの関数を構築する前は、この問題はありませんでした。

ありがとう!

4

3 に答える 3

5

代わりに、リストをタプルとして返します。

return mylist1, mylist2, mylist3

Python は 3 つのステートメントすべてを実行するのreturnではなく、最初のステートメントのみを実行します。

アイテムをさまざまなカテゴリに分類しようとしている場合は、通常、辞書を使用します。

buckets = {'abc': [], 'abd': [], 'xyz': []}
for segment in text:
    item, tag = segment.split('/', 1)
    buckets[tag].append(item)

これらの 3 つのリストを 3 つの変数に抽出することもできますが、バケットを直接参照することもできます。の代わりに、たとえばmylist1を参照します。buckets['abc']

于 2013-10-08T12:55:59.610 に答える
1

あなたの問題

mylist1,mylist2,mylist3 = [searchWord(segment) for segment in text]本当は完全なスタック トレースを含める必要がありましたが、この場合、リスト内包表記が 3 つ以上の値を返すため、それらを 3 つの変数だけに割り当てることはできないため、問題のある行であると推測するのは簡単でした。しかし、コードの問題は、return複数回試みていることです。

return mylist1
return mylist2
return mylist3

関数の戻り値は 1 つしかないため、次のように変更する必要があります。

return (mylist1, mylist2, mylist3)

解決策

あなたのコードを見て、あなたの欲求を見た後。私はあなたのためにそれを修正しました:

def catagorize(data):
    container = [[],[],[]]
    for segment in data:
        searchWord(segment, container)
    return container

def searchWord(segment, container):
    letter, tag = segment.split('/')
    if tag == 'abc':
        container[0].append(letter)
    elif tag == 'abd':
        container[1].append(letter)
    elif tag == 'xyz':
        container[2].append(letter)
    else:
        raise ValueError('unknown tag')

コードの実行:

>>> text = ["A/abc","B/abd","C/abc","D/xyz"]
>>> mylist1, mylist2, mylist3 = catagorize(text)
>>> print mylist1, mylist2, mylist3 
['A', 'C'] ['B'] ['D']

別の解決策

より堅牢なソリューション:

from collections import defaultdict

def catagorize(data):
    container = defaultdict(list)
    for letter, tag in (segment.split('/') for segment in data):
        container[tag].append(letter)
    return container

実際に:

>>> catagorize(["A/abc","B/abd","C/abc","D/xyz"])
defaultdict(<type 'list'>, {'xyz': ['D'], 'abc': ['A', 'C'], 'abd': ['B']})
于 2013-10-08T12:57:32.287 に答える
0

最初の 1 つだけreturnが実行されます。return応答返し、コントロールを呼び出し元に返します。それ以降の返品は実行されません。

したがって、期待どおりに 3 つのアイテムを返すのではなく、mylist の内容のみを返します (これは明らかに 3 つのアイテムのリストではありません)。

あなたが欲しいもの:

return (mylist1, mylist2, mylist3)
于 2013-10-08T12:57:33.150 に答える