假设我有一个空字典,用户可以添加任意数量的项目。在用户将项目添加到字典后,我想循环遍历该字典并能够从中提取值。由于我不知道密钥的名称,访问字典中项目的最佳方法是什么?
例如说我有以下内容:
# 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"到字典,我可以将它添加到字典和列表中。这样我就可以通过在列表中使用它的索引位置来查找字典中的项目。虽然看起来像是处理这种情况的坏方法,但很高兴得到你能提供的任何建议......
正如你所看到的,我是新人!
答案 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
中返回多个匹配项
对于找到的每个匹配apple
,m.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')}