2017-08-03 56 views
-1

我对python比较陌生,目前正在网上找到一个学校项目。当我运行这个代码时,它应该计算阵列中出现“Action”和“Sport”的次数。阵列搜索不工作 - 不知道为什么?

forename = ["Joe", "George", "Oliver"] 
HistoryGenre=[["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], ["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], ["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]] 
rr=1 
ActionCounter=0 
SportCounter=0 
while rr==1: 
    rec=input("Who would you like to recommend games for?") 
    if rec in forename: 
     rr+=1 
     r=forename.index(rec) 
     RepeatIndex=0 
     for i in HistoryGenre[r]: 
      if HistoryGenre[r:RepeatIndex]=="Action": 
      ActionCounter+=1 
      RepeatIndex+=1 
      else: 
       SportCounter+=1 
       RepeatIndex+=1 
      if RepeatIndex==9: 
       print(ActionCounter) 
       print(SportCounter) 

当我运行这段代码ActionCounter打印为0和SportCounter打印为9.我不明白怎样和为什么发生这种情况考虑输出应该是7和3就非常有可能更初学者错误。

回答

1

你的代码有问题就在这里

if HistoryGenre[r:RepeatIndex]=="Action": 

要引用第n项HistoryGenre [R],做

HistoryGenre[r][n] 

但你是在一个for循环在HistoryGenre [R]所以你可以做

for i in HistoryGenre[r]: 
    if i == "Action": 
     ... 

我不知道你给的项目是否禁止计数功能,但它会使你的生活要轻松很多。而不是添加到ActionCounter和SportCounter变量,你可以找到在这样每个列表计数:

ActionCounter = HistoryGenre[r][:9].count("Action") 

的[:9]需要在列表中,这是所有你似乎希望第一个9个元素。此外,您可以使用字典,而不是两个平行列表。在字典中,元素具有键,所以要引用某个元素,可以使用它的键。例如

namebook = {"Joe":["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], "George":["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], "Oliver":["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]} 

让Joe的书风格,只是用

namebook["Joe"] 

使用这些变化,你的程序可以由短了很多。

namebook = {"Joe":["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], "George":["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], "Oliver":["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]} 
inputname = input() 
print(namebook[inputname][:9].count("Action")) 
print(namebook[inputname][:9].count("Sport")) 
+0

值哇非常感谢你这固定我的问题。我似乎没有意识到搜索数组的恰当语法。然而,我仍然不知道为什么ActionCounter的输出为0,为什么它是9的SportCounter。另外,感谢你教我关于我从未使用过的字典。 –

+0

@OliD HistoryGenre [r:RepeatIndex] ==“Action”从来都不是真的,所以它总是会跳过它并转到else:SportsCounter + = 1。 –

0

这不回答你的问题,但是,因为它已经在这里找到答案就是我想出了计数的时间"Sports"数量,如果要实现这个"Action"发生在每个子列表。

for subList in HistoryGenre: 

    string = "" 

    string += ' '.join(subList) + " " 

    words = {} 

    for word in string.split(): 
     try: 
      words[word] += 1 
     except KeyError: 
      words[word] = 1 

    print(words) 


Out: 
    {'Sport': 3, 'Action': 7} 
    {'Sport': 7, 'Action': 3} 
    {'Sport': 5, 'Action': 5} 

word是关键

起初words[word]不存在。所以当我尝试words[word] += 1 该程序将导致KeyError,因为密钥word不存在。

,使程序不崩溃我exceptKeyError

里面KeyError块的关键word设置为价值1

如此,是因为word现在是一个关键的每个字在string.split()遇到时间,1被添加到word

+0

这会真的帮助你更好地理解我。但是除了KeyError:line是什么?显然,我对很多Python很不熟悉。 –

+0

@OliD我更新了我的答案 – 2017-08-03 21:43:04

相关问题