[英]Return Shared Values using Python Dictionary
当我给它一个文本字符串时,我需要一些帮助来提取整个python字典中的公共(共享)值。
例如,假设我有一个字符串,例如:
mylist = ["shirt","pants","shoes","tie","jacket"]
我还列出了使用dict()函数制成词典的品牌列表:
shirt Zara
shirt GAP
shirt Old Navy
shirt Banana_Republic
shoes Banana_Republic
shoes Zenga
shoes Zara
shoes Nike
shoes Adidas
tie Hermes
tie Ferragamo
tie Alfani
jacket Alfani
jacket Under_Armour
jacket Nike
jacket Polo
jacket The_North_Face
我需要我的函数返回一个常见品牌(任何两个共同性)的列表,其中给定品牌至少执行了原始列表中的两个类别。 因此适用于:mylist = ['衬衫','鞋子','领带','夹克']
someFunction(mylist)
返回:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
最初,我尝试编写一个forloop,该forloop本质上可以做到:
brandDictionary = dict(brands)
def mappings(list, dictionary):
for category in list:
return dictionary[category]
但这只返回一个值,我需要一串值
所以:
mappings(mylist, brandDictionary)
给我:
['Banana_Republic']
而不是我要查找的完整列表:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
注意在$ mylist中我也有“裤子”,它不存储在字典中。 该函数应该只返回我在字典中匹配的值,而不返回错误。
如前所述,您不能直接将该列表转换成字典。
但是,您可以构建一个值为列表或集合的字典,例如
{
"tie": ["Hermes", "Ferragamo", "Alfani"]
...
}
更好的是,使用相反的键和值构建字典,例如:
{
"Alfamni": ["tie", "jacket"]
...
}
如果您对集合对象感到满意,则可以使以后的处理非常短:将字典值和输入搜索目标(在顶部给出的mylist)相交,并查看结果集合的长度是否至少为2。
对于“裤子”,只需添加一个检查
if item in mydict.keys()
正如我在评论中所说的,python字典不支持重复键 。
考虑到这一点:
可能有一种更直接,更pythonic的方法可以做到这一点。 如果我正确理解了您的问题,这就是您想要的:
脚本
mylist = ["shirt","pants","shoes","tie","jacket"]
str_data ="""shirt Zara
shirt GAP
shirt Old Navy
shirt Banana_Republic
shoes Banana_Republic
shoes Zenga
shoes Zara
shoes Nike
shoes Adidas
tie Hermes
tie Ferragamo
tie Alfani
jacket Alfani
jacket Under_Armour
jacket Nike
jacket Polo
jacket The_North_Face"""
#dict list
data_dicts = [{line.split()[1]: line.split()[0]} for line in str_data.split("\n")]
clothes_matches = {}
#turn into a single dictionary
for data_dict in data_dicts:
for key, value in data_dict.items():
try:
clothes_matches[key].append(value)
except KeyError:
clothes_matches[key] = [value]
#count the number of o occurrences for each brand
result = []
for key,value in clothes_matches.items():
if len(value) >= 2:
result.append(key)
print(result)
输出
['Zara', 'Nike', 'Alfani', 'Banana_Republic']
希望这可以帮助! :)
可以实现collections.Counter
。 确保字典的结构不会导致重复的键错误。
from collections import Counter
clothing_map = {
'Zara': ['shoes', 'shirt'],
'GAP': ['shirt'],
'Old_Navy': ['shirt'],
'Banana_Republic': ['shoes', 'shirt'],
'Zenga': ['shoes'],
'Nike': ['jacket', 'shoes'],
'Adidas': ['shoes'],
'Hermes': ['tie'],
'Ferragamo': ['tie'],
'Alfani': ['jacket', 'tie'],
'Under_Armour': ['jacket'],
'Polo': ['jacket'],
'The_North_Face': ['jacket']
}
def get_brands(items = []):
l = [key for key, val in clothing_map.items() for x in items if x in val]
return [key for key, val in Counter(l).items() if val > 1]
mylist = ['shirt', 'pants', 'shoes', 'tie', 'jacket']
print(get_brands(mylist))
#['Alfani', 'Nike', 'Zara', 'Banana_Republic']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.