我的文字如下:
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.
我的“文本”列表很大,这可能是问题吗?在为此过程构建函数之前,我没有这个问题。
谢谢!
最佳答案
您的问题
您确实应该包括完整的堆栈跟踪,但是在这种情况下,很容易推断出mylist1,mylist2,mylist3 = [searchWord(segment) for segment in text]
是有问题的行,因为list-comprehension返回的值超过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']})
关于python - 太多值无法在python中解压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19248278/