繁体   English   中英

使用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

我需要我的函数返回一个常见品牌(任何两个共同性)的列表,其中给定品牌至少执行了原始列表中的两个类别。 因此适用于: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM