0

我对python很陌生,我正在努力解决如何循环以下问题的逻辑。所以,我有一个简单的列表,就像这样:

cat_list = [
            ["cambridge university", "cricket", "cu c url name"],
            ["cambridge university", "football", "cu f url name"],
            ["cambridge university", "golf", "cu g url name"],
            ["cambridge university", "default", "cu d url name"],
            ["oxford university", "cricket", "ou c url name"],
            ["oxford university", "football", "ou f url name"],
            ["oxford university", "golf", "ou g url name"],
            ["oxford university", "default", "ou d url name"],
            ["hertford university", "default", "hu d url name"],
           ]

然后,我有两个字符串xy持有:

x = "cambridge university"
y = "nfl" # this can change

现在,我想检查(使用 for 循环)是否匹配一行,x如果匹配,我想打印相应的 url 值(cat_list 的第三列)。此外,如果它在 cat_list 中找不到(但找到),我想转到它的相应值并再次打印出 cat_list 中相应的 url 值。ycat_listyxdefault

因此,对于x以上y内容,我希望 for 循环输出cu d url name

然而,如果说xy

x = "oxford university"
y = "cricket"

然后我喜欢 for 循环输出ou c url name

抱歉,如果这是一个 101 问题 - 认为我只是非常困惑:(

编辑

因此,显然,可以运行一个简单的循环,如 qwwqwwq 所述:

for item in cat_list:
    if item[0] == x and item[1] == y:
        print item[2]
for item in cat_list:
    if item[0] == x and item[1] == 'default':
        print item[2]

但是,x = "oxford university" y = "cricket"以上两者if都会得到满足 - 这不是我想要的。“默认”值仅应在y未找到对应的运动()的情况下打印x

4

2 回答 2

0

正如其他答案所建议的那样,您可以对列表进行简单的循环以查看是否有匹配的值。处理默认值有点复杂,但是如果您在浏览列表时看到它可以保存,然后在到达循环末尾时打印它。

default = None
for university, sport, url_name in cat_list:
    if university == x:
        if sport == y:
            print url_name
            break # stop looping
        elif sport == 'default':
            default = url_name
else: # triggered only if the loop reached the end without hitting a break statement
    print default

如果你要多次查询同一个列表,你可以使用字典来获得更好的性能。以下是从当前列表创建字典的方法:

cat_dict = {(university, sport): url_name for (university, sport, url_name) in cat_list}

查询给定的xand y

if (x, y) in cat_dict:
    print cat_dict[x, y]
else:
    print cat_dict[x, 'default']

这个版本O(1)平均每个查询花费(恒定)时间,而上面的循环是O(N).

于 2013-10-22T20:51:26.743 回答
0

使用数据结构,您需要循环两次,如果您在第一次尝试时没有找到 x 和 y 匹配,则查找默认值,如果您没有找到默认值,可能会引发异常。 .

def get_url(x,y,cat_list):
    for item in cat_list:
        if item[0] == x and item[1] == y:
            return item[2]
    for item in cat_list:
        if item[0] == x and item[1] == 'default':
            return item[2]
    raise Exception("No default url found  for {university}".format(university = x))
于 2013-10-22T20:18:31.023 回答