Return 使用 Python 词典的共享值
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
我需要我的函数 return 一个常见品牌列表(任意两个共性),其中给定品牌至少包含我原始列表中的两个类别。
因此对于:
mylist = ['shirt','shoes','tie','jacket']
someFunction(mylist)
returns:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
起初我尝试编写一个 forloop,它基本上执行以下操作:
brandDictionary = dict(brands)
def mappings(list, dictionary):
for category in list:
return dictionary[category]
但这return只是一个值,我需要一串值
所以:
mappings(mylist, brandDictionary)
给我:
['Banana_Republic']
不是我要找的完整列表:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
另请注意,在 $mylist 中,我有 "pants" 未存储在我的字典中。此函数应该 return 我在字典中匹配的值,而不是 return 错误。
您不能直接将该列表转换为字典,如前所述。
但是,您可以构建一个值为列表或集合的字典,例如
{
"tie": ["Hermes", "Ferragamo", "Alfani"]
...
}
更好的是,构建键和值颠倒的字典,例如:
{
"Alfamni": ["tie", "jacket"]
...
}
如果你对set objects很满意,你可以让你后面的处理很短:将字典值和输入的搜索目标相交(你在上面给出的mylist) , 并查看结果集的长度是否至少为 2.
对于"pants",只需添加一个检查
if item in mydict.keys()
这是可以实现的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']
正如我在评论中所说 python 字典 do not support duplicated keys。
考虑到这一点:
可能有更直接和 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']
希望对您有所帮助! :)
当我给它一个文本字符串时,我需要一些帮助来提取 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
我需要我的函数 return 一个常见品牌列表(任意两个共性),其中给定品牌至少包含我原始列表中的两个类别。 因此对于: mylist = ['shirt','shoes','tie','jacket']
someFunction(mylist)
returns:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
起初我尝试编写一个 forloop,它基本上执行以下操作:
brandDictionary = dict(brands)
def mappings(list, dictionary):
for category in list:
return dictionary[category]
但这return只是一个值,我需要一串值
所以:
mappings(mylist, brandDictionary)
给我:
['Banana_Republic']
不是我要找的完整列表:
[‘Zara’,’Banana_Republic’,’Alfani’,’Nike’]
另请注意,在 $mylist 中,我有 "pants" 未存储在我的字典中。此函数应该 return 我在字典中匹配的值,而不是 return 错误。
您不能直接将该列表转换为字典,如前所述。
但是,您可以构建一个值为列表或集合的字典,例如
{
"tie": ["Hermes", "Ferragamo", "Alfani"]
...
}
更好的是,构建键和值颠倒的字典,例如:
{
"Alfamni": ["tie", "jacket"]
...
}
如果你对set objects很满意,你可以让你后面的处理很短:将字典值和输入的搜索目标相交(你在上面给出的mylist) , 并查看结果集的长度是否至少为 2.
对于"pants",只需添加一个检查
if item in mydict.keys()
这是可以实现的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']
正如我在评论中所说 python 字典 do not support duplicated keys。
考虑到这一点:
可能有更直接和 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']
希望对您有所帮助! :)