2013-10-22 35 views
0

我对Python很新,我正在努力处理如何循环通过下面的问题的逻辑。所以,我有一个简单的列表,就像这样:python for循环逻辑来检查变量对

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循环)如果xy匹配cat_list行,如果它,我想打印相应的url值(cat_list的第三列)。此外,如果在cat_list中找不到y(但找到了x),我想转到其对应的default值,并再次在cat_list中输出相应的url值。

所以,上面的xy,我想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

+0

+1对你想达到什么的详细解释,但是-1对于你自己试图解决这个问题的尝试没有示范 – user4815162342

+0

你可以尝试使用python字典。 http://docs.python.org/2/tutorial/datastructures.html#dictionaries –

回答

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} 

查询它对于给定的xy

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

这个版本需要O(1)(常量)时间对于每个查询的平均值,而上面的循环是O(N)

+0

@Blcknght:非常感谢这个详细的答案!它现在肯定有效!接受你的答案。再次感谢你的帮助! – AJW

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)) 
+0

感谢这一点 - 但我有这个小问题 - 现在与你的代码发生了什么,这两个'if'循环得到满足(说'x =“牛津大学”和“y =”板球“')。我想要的是如果满足'x'和'y'来打印相应的URL值和'NOT'作为它的默认值。我在这里有意义吗? :( – AJW

+0

@JamesW:这段代码可以正常工作,如果在第一个循环中找到完全匹配,那么'return'语句将立即结束它的执行,所以你不会从第二个列表返回缺省值。可能会在第一个循环中保存默认值,这样就不需要循环两次(只需要在一次循环中进行两次测试),虽然(仍然是'O (N)')。 – Blckknght

+0

@Blckknght:我是说这只适用于如果它是一个函数,而不是如果for循环是独立的,因为我已经发布在编辑部分。问题是,我正在这样做在django模板中,所以我不能有任何'功能'作为这样的:( – AJW