我将解释我的代码的行为
您输入文件名和项目名称。
它将显示项目名称和列表中行的数量。
第一个问题:实际上,我希望它显示列表中的第二项并告诉它是重复的。目前,如果我删除list(set(),我会在同一个字符串中单独输出2个香蕉。
我正在导入的.txt文件示例。
bananes: 18
pommes: 23
bananes: 13
我正在导入的.txt文件示例。
pommes : 54
: 18
banane:
oranges : 30
输入示例:
item.py data10.txt bananes
所需输出的示例:
La ligne banane : 13 est un doublon.
输出我得到了:
La ligne ['1', 's', ' ', 'e', ',', "'", '8', 'n', ':', 'b', '2', 'a'] est un doublon.
第二个问题:如果我写任何其他单词而不是列表中的单词,这样可以正常工作。但实际上,如果我写下该单词的几个首字母,它仍会完全显示该行。
输入示例:
item.py data10.txt pomm
所需输出的示例:
pomm: 0
我得到的输出:
pomme: 30
这是我的代码,因此您可以了解我的工作:
import sys
def ligne(texte):
try:
with open(texte) as ouvrir:
lecture = ouvrir.readlines()
words = [" : ".join([x.strip() for x in line.split(":")]) for line in lecture]
words = [x for x in words if len(x) > 1]
return words
except IOError:
print("Le fichier", texte, "n'existe pas.")
sys.exit()
def recherche(essaie):
while True:
if len(essaie) > 3:
print("Deux arguments sont attendus, le nom du fichier d'inventaire et l'item")
sys.exit()
elif len(essaie) < 3:
print("Il faut préciser le nom du fichier et de l'item.")
sys.exit()
else:
entree = essaie[1]
item = essaie[2]
choix = str(entree)
texte = choix.strip("[']")
resultat = [s for s in ligne(texte) if item in s]
resultat2 = str(resultat)
longueur = len(resultat)
resultat3 = resultat2.strip("[']")
resultat4 = list(set(resultat3))
if item in str(ligne(texte)):
if longueur > 1:
print("La ligne", resultat4, "est un doublon.")
sys.exit()
else:
print(resultat3)
sys.exit()
else:
print(item, ": 0")
sys.exit()
if __name__ == "__main__":
recherche(sys.argv)
答案 0 :(得分:2)
您可能需要考虑使用字典来解决此问题,而不是列表/字符串集。您可以在行中读取键/值对,然后检查键中是否已存在键。如果是这样,它就是重复并引发异常(如果你愿意,你可以用它代替打印的字符串和sys.exit(0)。
检查下面的示例代码......
import sys
def ligne(texte, item):
try:
with open(texte) as ouvrir:
words_dict = {} #Create new, empty dictionary
lecture = ouvrir.readlines()
for line in lecture: #For each line in .txt file
line = line.strip('\n')
key, number = line.split(':')[0], int(line.split(':')[1]) #Item is before ':', value is after
if key not in words_dict.keys():
words_dict[key] = number #If that item isn't in the dictionary yet (this is the first occurence), add it
elif key == item: #If the duplicate is the inputed item
raise Exception('La ligne {} est un doublon.'.format(line)) #If that item is already in the dictionary, raise an exception
return words_dict #If there are no duplicates, the dictionary will be returned, if there are, it will return the error above
except IOError:
print("Le fichier", texte, "n'existe pas.")
sys.exit()
def recherche(essaie):
if len(essaie) > 3:
print("Deux arguments sont attendus, le nom du fichier d'inventaire et l'item")
sys.exit()
elif len(essaie) < 3:
print("Il faut preciser le nom du fichier et de l'item.")
sys.exit()
else:
entree = essaie[1]
item = essaie[2]
choix = str(entree)
texte = choix.strip("[']")
resultat_dict = ligne(texte, item) #If this returns without raising an exception, there were no duplicates
if item in resultat_dict.keys():
print item, ": {}".format(resultat_dict[item]) #If the item was in the .txt file, print it and its value
else:
print item, ": 0" #If not, print with a value of zero
if __name__ == "__main__":
recherche(sys.argv)
我试着留下评论来解释所有的变化,但如果有什么不清楚,请告诉我。关键的变化是将文件读入字典并在发现重复时引发异常,但我尽可能地保持原始代码的结构完整(尽管可能有更简单的方法/更有效的方法去吧)。 recherche函数的最后一部分也变得更简单,因为你知道如果ligne返回没有错误,就没有重复。