在python中用函数解包的值太多?

2024-10-02 00:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的文本:

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.

我的“文本”列表相当大,这可能是问题所在吗?在为这个过程构建函数之前,我没有这个问题。

谢谢!


Tags: text文本rereturniftagsegmentword
3条回答

将列表作为元组返回:

return mylist1, mylist2, mylist3

Python不执行所有三个return语句,只执行第一个。

如果您尝试将项目分类,通常会使用字典:

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

然后,您仍然可以将这三个列表提取为3个变量,但您也可以直接引用bucket。例如,您将引用mylist1,而不是buckets['abc']

只执行第一个returnreturn返回一个答案,并将控件返回给调用者。之后的任何返回都不会运行。

因此,您不会像预期的那样返回三个项目,而只返回mylist的内容(这显然不是一个三个项目列表)。

你想要什么:

return (mylist1, mylist2, mylist3)

您的问题

您确实应该包含完整的堆栈跟踪,但在这种情况下,很容易推断出mylist1,mylist2,mylist3 = [searchWord(segment) for segment in text]是有问题的行,因为列表理解返回的值超过3个,所以不能将它们仅分配给3个变量。但代码中的问题是,您试图return多次。

return mylist1
return mylist2
return mylist3

一个函数只能有一个返回,因此应该将其更改为:

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']})

相关问题 更多 >

    热门问题