当涉及到生成器时,运行新的列表通过函数

2024-04-23 14:51:33 发布

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

在下面的代码中,我尝试重新运行一个新列表,该列表是通过删除前三个列表项创建的,这些列表项已经与giveHref()函数中的某个轨迹匹配。我试图通过decrementList()函数运行新列表,但收到以下错误:generator object decrementList at 0x104cb8050。为什么我不能再次通过函数运行这个新列表?你知道吗

我也有这样的问题自动完成,直到没有更多的列表项,所以任何意见/建议,这将是有益的。我想这个程序运行一次,并返回所有的HREF匹配递减列表项匹配的API跟踪。你知道吗

import requests
import json

# initial message
message = "if i can't let it go out of my mind"

# split into list
split_message = message.split()

# get lenth of original list
size = len(split_message)

def decrementList(words):
    #decrement list by 1 for each try
    for w in [ words ] + [ words[:-x] for x in range(1, len(words)) ]:
        url = 'http://ws.spotify.com/search/1/track.json?q='
        request = requests.get(url + "%20".join(w))

        json_dict = json.loads(request.content)
        num_results = json_dict['info']['num_results']

        if num_results > 0:
            num_removed = len(words) - len(w)

            track_title = ' '.join(w)

            # yield number of list items removed, possible track name that
            # is comprised of list items, actual track names from API and new decremented list
            # all through generator
            for track in json_dict["tracks"]:
                if track["name"].lower().startswith(track_title.lower()):
                    yield num_removed, track, track["name"], w


# finds and returns HREF of first match of track name made from decremented list and API track name
def giveHref():
    for num_words_removed, track, track_name, w in decrementList(split_message):
        if ' '.join(w) == track_name.lower():
            return track['href'], num_words_removed


track['href'], num_words_removed = giveHref()

# creates new list with items from the previously matched track removed
# in this case, first three list items are removed, as they previously matched to a track
def newMessage():
    new_message_length =  size - num_words_removed
    new_message = split_message[new_message_length:size]
    return new_message


new_message = newMessage()

decrementList(new_message)

Tags: ofnameinjsonmessage列表newfor
1条回答
网友
1楼 · 发布于 2024-04-23 14:51:33

通过使用yield,您将从函数中获得一个生成器对象,而不是一个列表。您必须遍历它,或者如果您想使用它,就将它强制为一个列表。你知道吗

[x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(x for x in range(10))
<generator object <genexpr> at 0x137a870>

list((x for x in range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

阅读somedocs或看this answer,确保你理解其中的区别。你知道吗

在您的情况下,您可以使用列表压缩来获得您似乎想要的内容。你知道吗

def dec(l):
    for i, w in enumerate(l):
        yield l[i:]

stuff = ["one", "two", "three", "four"]
print [x for x in dec(stuff)]

相关问题 更多 >