这是我的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方法中起作用。
答案 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']}