Python - 如何访问由用户输入添加的字典中的值?

时间:2017-09-28 19:37:48

标签: python list dictionary

假设我有一个空字典,用户可以添加任意数量的项目。在用户将项目添加到字典后,我想循环遍历该字典并能够从中提取值。由于我不知道密钥的名称,访问字典中项目的最佳方法是什么?

例如说我有以下内容:

# my shopping cart that starts off empty
shopping_cart = {}

# user enters how many items they will have in the cart total
total_items = input("How many items will you add to your cart? ")

# User adds both the value and the key of each item to add
for i in total_items:
    name = input("Enter name of item to add: ")
    location = input("Is the item in front, middle, or back of cart? ")

    shopping_cart[name] = location

此时我有一个shopping_cart字典,但我无法知道KEYs或VALUE是什么。

.....现在说有一些大的数字字符串,按随机顺序称为random_string。它看起来像" axdfebzsdcdsl apple fjdkslaz ....."注意字符串是如何随机的,但是周期性地存在诸如" apple"之类的项目的名称。和"配对"。

我想要做的是循环我的shopping_cart词典,找到random_string中我shopping_cart中的项目所在的下一个索引位置。

例如 - 让我们说用户将3个商品添加到购物车。这些项目是" donkey"," apple"," pair"。

我想要做的是按顺序读取random_string,并返回字符串中下一个出现的字典值。 I.E.在这种情况下," apple"是随机字符串中的下一个项目,因此应该返回它,以便我可以查找" apple"的值。在字典中获取项目的位置。

我有工作代码来做所有必要的事情,除了知道如何从字典中拉出Keys。我在下面复制了一行,基本上显示了我想要完成的工作。问题是我不知道 DICT_KEY 是什么,因为它是由用户添加的。

index = random_string.find([DICT_KEY], index)

........不要混淆事情,但我正在考虑制作一个反映字典值的空列表。换句话说,当用户添加项目" apple"到字典,我可以将它添加到字典和列表中。这样我就可以通过在列表中使用它的索引位置来查找字典中的项目。虽然看起来像是处理这种情况的坏方法,但很高兴得到你能提供的任何建议......

正如你所看到的,我是新人!

1 个答案:

答案 0 :(得分:1)

>>> a={'apple':'front','donkey':'middle','pair':'back'}
>>> s='asdfhskdfksjdf;ksjapplefsakdjfskdjfapplesdfksdjdonkeydlkfjsldjfdpair'
>>> {k:[m.start() for m in re.finditer(k,s)] for k in a}
{'pair': [64], 'donkey': [47], 'apple': [18, 35]}

这一个在索引apple / donkey / pair / {的字符串中找到两个18,一个35和一个47 {1}}。

<强>解释
跟进前面使用的命令

使用我拥有的64创建一个新词典并指定一个常量值。

keys

这允许我们创建一个字典,每个键具有相同的值>>> a {'pair': 'back', 'donkey': 'middle', 'apple': 'front'} >>> {k:0 for k in a} {'pair': 0, 'donkey': 0, 'apple': 0} 0是您已经制作的词典。

现在让我们看看如何将值设置为大字符串中这些单词的索引。

a

re.finditer会在>>> [m.start() for m in re.finditer('apple',s)] [18, 35] s中返回多个匹配项 对于找到的每个匹配applem.start()返回匹配的起始索引 现在,这给出了一个索引列表,其中apple出现在字符串中。

最后,如果我们将上面两个结合起来,我们会得到一个带有原始密钥的字典。并将值作为它们出现在字符串中的索引列表。

m

<强> UPDATE2
新的需求之后。在评论中

>>> {k:[m.start() for m in re.finditer(k,s)] for k in a}
{'pair': [64], 'donkey': [47], 'apple': [18, 35]}

如果你不想再去两次..

>>> d={k:[m.start() for m in re.finditer(k,s)] for k in a}
>>> from collections import defaultdict
>>> nd=defaultdict(list)
>>> for k in d:
...   nd[a[k]].extend(d[k])
... 
>>> dict(nd)
{'front': [18, 35], 'middle': [47], 'back': [64]}

<强> UPDATE3

>>> from collections import defaultdict
>>> nd=defaultdict(list)
>>> for k in a:
...   for m in re.finditer(k,s):
...     nd[a[k]].append(m.start())
... 
>>> dict(nd)
{'front': [18, 35], 'middle': [47], 'back': [64]}

<强>已更新

如果指数对您更重要,请执行以下操作

>>> {(k,a[k]):[m.start() for m in re.finditer(k,s)] for k in a}
{('pair', 'back'): [64], ('apple', 'front'): [18, 35], ('donkey', 'middle'): [47]}
>>> {m.start():(k,a[k]) for k in a for m in re.finditer(k,s)}
{64: ('pair', 'back'), 18: ('apple', 'front'), 35: ('apple', 'front'), 47: ('donkey', 'middle')}