所以我正在尝试做一些基于CLI/文本的购物程序,该程序为产品预定义了字典。(包括产品名称、数量、价格(
完成了一半,但在";搜索";选项
基本上,我有一个菜单,有5个选项。
- 搜索产品
- 转到购物篮
- 购买
- 注销
- 退出
如果用户选择1/搜索产品=>程序应要求用户提供搜索词,如水、果汁、苹果等。例如,如果用户提供水作为输入,程序应显示其中包含水的所有内容以及价格,并用数字列出。
假设我们有这个预定义的字典。
inventory = {"Rose water": [10,5], "Salty water": [5,10], "Apple": [3,10], "Sugary water": [1,5], "Cream": [5,6]}
dict=产品名称中的密钥
dict=中的值第一个值是数量,第二个值是价格
例如:
search = water
found = Found 3 similar products
1. Rose water 5$
2. Salty water 10$
3. Sugary water 5$
我应该走哪条路?我试图只使用函数/def来实现这一点。我应该试着上课吗?因为我有点拘泥于搜索和添加产品到篮子里。
dictionary的一个限制是您不能"直接";在字典中查找部分关键字。你必须循环浏览它们才能找到答案。有其他方法可以做到这一点,你可以在学习过程中不断学习。
使用循环键搜索部分键
现在,您可以使用列表理解在字典中循环,并在每个键中搜索部分键。如果找到,您可以选择价格并进行展示。在显示之前,您需要确保数量大于零(0(。
以下是操作方法。
inventory = {"Rose water": [10,5],
"Salty water": [5,10],
"Apple": [3,10],
"Sugary water": [1,5],
"Cream": [5,6]}
search = 'water'
#search each key in the inventory for word containing partial key search
#if found, ensure there are enough quantity to purchase
#if both conditions are satisfied, store key and price into results
results = [[key,value[1]] for key, value in inventory.items() if search.lower() in key.lower() and value[0] > 0]
#if results list contains any values, then print the details
if results:
print ('Found', len(results), 'similar products')
#iterate thru the results list and print the product name and price
for i,(k,v) in enumerate(results):
print (' {}. {} {}$n'.format(str(i+1),str(k),str(v)))
#if no values found in results, display product not found
else:
print ('No products found for', search)
这里,糖水有1个项目。您的搜索结果将是:
search = water
Found 3 similar products
1. Rose water 5$
2. Salty water 10$
3. Sugary water 5$
search=水,Sugary water=0可用量。
inventory = {"Rose water": [10,5],
"Salty water": [5,10],
"Apple": [3,10],
"Sugary water": [0,5],
"Cream": [5,6]}
输出为:
Found 2 similar products
1. Rose water 5$
2. Salty water 10$
如果搜索=牛奶,则在库存中找不到,因此您将收到不同的消息。
search=牛奶
输出为:
No products found for milk
使用pandas搜索选项
import pandas as pd
df = pd.DataFrame.from_dict(inventory,orient='index')
df.columns = ['Quantity', 'Price']
print (df)
#with filter option
print (df.filter(like='water', axis=0))
#with lambda function
print (df[df.index.map(lambda x: 'water' in x)])
#with search loop of df.index
print (df[['water' in s for s in df.index]])
其输出为:
您的完整数据帧将是:
Quantity Price
Rose water 10 5
Salty water 5 10
Apple 3 10
Sugary water 0 5
Cream 5 6
您对water
的搜索结果将是:
Quantity Price
Rose water 10 5
Salty water 5 10
Sugary water 0 5
您可以按键循环浏览库存字典,并打印出其中包含搜索的项目。
search = "water"
inventory = {"Rose water": [10,5], "Salty water": [5,10], "Apple": [3,10], "Sugary water": [1,5], "Cream": [5,6]}
match = []
for key in inventory:
if search in key:
match.append([key, inventory[key][1]])
print("found = Found", len(match), "similar products")
for i in range(len(match)):
print(i+1, match[i][0], str(match[i][1])+'$')
使用循环,可以检查字典中值的键。如果搜索是in
项目名称。然后我们使用循环以某种格式打印出项目。
您可以循环遍历字典,并使用in
关键字检查输入值是否在产品名称中。
类似这样的代码:
theInput = "water"
inventory = {"Rose water": [10,5], "Salty water": [5,10], "Apple": [3,10], "Sugary water": [1,5], "Cream": [5,6]}
# Use something like below line
output = [[i, inventory[i]] for i in inventory if theInput.lower() in i.lower()]
print(output)
如何格式化输出:
print("found = Found %i similar products" %len(output))
for each in output:
print("%i. %s %i$n" %(output.index(each)+1, each[0], each[1][1]))