重新排序“dict”对象并将多个键铲入值数组(在字典中交换键值)| Ruby到Python

时间:2018-01-01 16:59:32

标签: python ruby dictionary

这是我的Ruby代码。我想将此函数转换为Python 3等效函数。

files = {
  'Input.txt' => 'Randy',
  'Code.py' => 'Stan',
  'Output.txt' => 'Randy'
}    

def group_by_owners(files)
  files.each_with_object({}) { |(key, value), new_hash| (new_hash[value] ||= []) << key }
end

puts group_by_owners(files)

Ruby结果如下所示:

{"Randy" => ["Input.txt", "Output.txt"], "Stan" => ["Code.py"]}

Python将是:

{"Randy": ["Input.txt", "Output.txt"], "Stan": ["Code.py"]}

以下是我的尝试:

def group_by_owners(files):
  new_dict = dict(zip(files.values(), (files.keys())))
  print(new_dict)

然后我试图将键附加到数组。

def group_by_owners(files):
  keys_array = []
  new_dict = dict(zip(files.values(), keys_array.append((files.keys()))))

但我不认为这会在zip方法中起作用。

3 个答案:

答案 0 :(得分:1)

在Python中,您提到的数据结构称为字典(代码方面为dict),在语法上表示为:

files = {
   'Input.txt': 'Randy',
   'Code.py': 'Stan',
   'Output.txt': 'Randy'
}

要更换dict的键和值,您可以使用collections.defaultdict作为:

from collections import defaultdict

swapped_dict = defaultdict(list)

for key, value in files.items():
    swapped_dict[value].append(key) 

其中swapped_dict是保存值的dict对象:

{
    'Randy': ['Output.txt', 'Input.txt'],
    'Stan': ['Code.py']
}

注意: Ruby维护顺序,但在Python版本中&lt; 3.6,dict对象本质上是无序的。但是,from Python version >= 3.6, dict objects are now ordered in nature

对于Python版本&lt; 3.6,我们有collections.OrderedDict来维护键的插入顺序。以下是显示键/值对交换的示例:

from collections import OrderedDict

# for maintaining the order, your initial list 
# should also be of the type `OrderedDict`
old_dict = OrderedDict([('Input.txt', 'Randy'), ('Code.py', 'Stan'), ('Output.txt', 'Randy')])

for k, v in old_dict.items():
    new_dict.setdefault(v, []).append(k)
    # You may use `setdefault` on normal dictionaries too

dict对象返回为:

>>> new_dict
OrderedDict([('Randy', ['Input.txt', 'Output.txt']), ('Stan', ['Code.py'])])

它就像这样表示,你可以像普通字典对象一样访问new_dict

答案 1 :(得分:0)

def group_by_owners(files: dict): -> dict
    res = {v: [] for v in files.values() }
    for k, v in files.items():
        res[v].append(k)
    return res

注意:在Python dicts中是无序的(直到3.7版本)。

答案 2 :(得分:0)

这是Python中files的字典版本:

files = {'Input.txt': 'Randy',
         'Code.py': 'Stan',
         'Output.txt' : 'Randy'}

files.items()返回:

dict_items([('Input.txt', 'Randy'), ('Code.py', 'Stan'), ('Output.txt', 'Randy')])

def group_by_owners(files):    
    result = dict() # empty dict

    for k, v in files.items(): 
        if v in result:
            result[v].append(k) # Append to list value if the key is in result
        else:
            result[v] = [k]  # Add key: value        

    return result


print(group_by_owners(files))
# {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}