2012-11-21 23 views
1

我第一次在这里提问。我有一个名称的文本文件,每行一个名称,我正在阅读列表,然后重复该列表两次,第一次删除\ n's,第二次将列表小写。然后我向用户索要一个搜索词,并将它们的输入转换为小写,然后搜索列表的小写版本,然后我得到匹配的索引,并使用它显示该小写的非小写版本将项目列表返回给用户(以便他们可以键入例如anivia并返回Anivia)。这工作正常,但我确定我的代码非常糟糕。我想要做的是为列表文件中的某些名称添加特定的缩写,并接受这些缩写作为输入,但仍显示全名。例如,用户输入“mumu”并且它看到该列表具有Amumu-mumu,以引用Amumu。我怎么能接受这个减少?另外还有其他一些例子,如财富小姐或Kha'Zix的kha。我想也许有第二个文件包含缩写列表,但这似乎很浪费,我相信这是一个更好的方法。这里是我的不好的代码至今:需要将字符串匹配到Python中的文件中

f = open("champions.txt") #open the file 
list = f.readlines() #load each line into the list 
#print list 
list2 = [item.rstrip('\n') for item in list] #remove trailing newlines in copy list 
list3 = [item.lower() for item in list2] #make it all lowercase 

print "-------\n", list2 #print the list with no newlines just to check 

print "which champ" #ask user for input 
value = raw_input().lower() #get the input and make it lowercase 
if value in list3: #check list for value and then print back a message using that index but from the non-lowercase list 
    pos = list3.index(value) 
    print "list contains", list2[pos] 
else: #if the input doesn't match an item print an error message 
    print "error" 

生病把这一切都变成了一些功能在我的主文件,一旦它的工作,我需要的方式。基本上,我想改变我的文本文件中的一些行,使其具有有效的替代方案,并且能够接受这些内容,并仍将全名显示给用户。例如,具有缩写在我的中学文本文件中的线路之一有一行:

Kog'Maw - kogmaw, kog, km 

我如何简化我有什么,并添加功能?我不确定从哪里开始,我对Python和编程一般都很陌生。感谢您提供任何帮助,对于这么长的帖子感到抱歉。

+0

你不应该调用一个变量'list';它是一个python builtin的名字。 –

+1

你提到一个辅助文本文件。它是什么时候创建的?它是什么? – martineau

+0

@martineau我自己做的,他们看起来像这样:[链接] http://www.pasteall.org/37416 – Kassandra

回答

2

好的,这里是一个修改后的答案,假设有一个文件包含名称和缩写,如this开头所示。

本质上,它所做的是制作一个大型查找表,它将文件中的任何缩写以及小写的名称本身映射到每行开头的名称。

lookup = {} 
with open("champions.txt") as f: 
    for line in f: 
     line = line.rstrip().split('-', 1) 
     if not line: continue # skip any blank lines 

     name = line[0].strip() 
     lookup[name.lower()] = name 
     if len(line) == 2: # any alternative names given? 
      for item in line[1].split(','): 
       lookup[item.strip()] = name 

print 'lookup table:' 
for alt_name, real_name in sorted(lookup.items()): 
    print '{}: {}'.format(alt_name, real_name) 
print 

while True: 
    print "which champ (Enter to quit): " # ask user for input 
    value = raw_input().lower() # get the input and make it lowercase 
    if not value: break 

    real_name = lookup.get(value) 
    if real_name: 
     print 'found:', value, '-->', real_name 
    else: 
     print 'error: no match for', value 
+0

我想要我的名字列表文件(champions.txt)在名称的行上具有有效的缩写,并且我希望能够将全名打印回给用户,即使他们输入缩写或具有不同的外壳(Lux vs勒克斯)。我的项目有另一个文件来写statss,用户输入每个名字,所以我需要能够接受缩写,所以它更快,更自然。 – Kassandra

+0

谢谢@martineau我会试一试,看看它是如何工作的,也感谢你的意见,它可以帮助我更好地理解它 – Kassandra

+0

我已经到处尝试你的版本,但它似乎并不运行,我得到一个valueerror:PS C:\ Users \ Kassandra \ pystuff> python helptest1.py 查找表: 回溯(最近呼叫最后): 文件“helptest1.py”,第15行,在 打印'{}:{}'。格式(alt_name,real_name) ValueError:零长度字段名称格式 – Kassandra

0

首先,您应该使用有用的名称。所以,与其list2称之为lower_names

其次,你可以更换in运营商和index通话仅由一个index电话。如果您注意到,致电some_list.index(item_which_does_not_exist)将引发valueError表示该项目不在列表中。最“pythonic”的方法是通过try来获得索引,如果失败,则为except,那么你会做别的。

所以,你可以用这个代替if部分:

try: 
    pos = list3.index(value) 
except ValueError: 
    print 'error' 
else: 
    print 'everything is ok. there was no exception raised' 
    print 'list contains', list2[pos] 

它在蟒蛇的理念,这是更好地请求原谅比许可常说。 :)

另一个重要的事情,这只是假设你想匹配一个小写字母的名字,它的“真实”的名字,你需要在这里一个字典。一个字典将一个键映射到一个值,所以你在这里是一个你希望每个小写名字(键)映射到真实名字(值)的情况。它可以被定义这种方式(我看你熟悉一个衬垫):

name_map = {item.lower(): item for item in (line.strip() for line in f)} 

因此,而不是使用readlines,您可以通过文件直接循环。这是Python中的额外糖。

然后,您可以执行如下操作:value in name_mapreal_name = name_map[value]

至于额外的功能,我会去你的第二个选项,这是name - nickname1,nickname2。所以你需要做的是:读取每一行,按破折号-(或任何其他不会在名称中使用的字符)拆分,然后用逗号分隔第二部分以使每个名称单独存在。结束语:

name_map = {} 
nick_map = {} 
for line in f: 
    parts = line.strip().split('-') 
    name = parts[0].strip() 
    nicks = {n.strip(): name for n in parts[1].split(',')} 
    name_map[name.lower()] = name 
    nick_map.update(nicks) 

# To check a name: 
if value in name_map: 
    # Exact match 
elif value in nick_map: 
    # Nickname match 
else: 
    # No Match 

你可以做尝试当量/除/ else子句,但是,这将使过多的嵌套,这是不推荐使用。

+0

这看起来很有前途,但我如何处理名称列表文件加载到name_map和nick_map ?特别是只有一些具体的名字有缩写 – Kassandra

+0

这就是第一个循环所做的,从文件中读取并填充字典。martineau的答案更详细,并处理所有这些情况。 – jadkik94

相关问题