在 Python 中,我有一个简单的转换列表和字典的问题,我使用显式类型检查解决了这个问题,以区分整数和整数列表。我对python有点陌生,我很好奇是否有更“pythonic”的方法来解决问题,即避免显式类型检查。
简而言之:尝试使用值对字典的键进行排序,但是每个键可以有多个值,并且键需要在列表中出现多次。数据以 形式出现{'a':1, 'b':[0,2],...}
。我提出的所有内容(使用 sorted( , key = ) )都被以下事实绊倒了:一次出现的值不能指定为整数而不是列表 1 的长度。
我想在表单{'a':3, 'b':0, 'c':[2,4], 'd':[1,5]}
和列表的字典之间进行转换['b', 'd', 'c', 'a', 'c', 'd']
(列表中项目的位置由字典中的值指定)。
该函数list_to_dictionary
应该为列表中出现的每个项目都有一个键,其值给出列表中的位置。如果一个项目出现不止一次,该值应该是一个存储所有这些位置的列表。
该函数dictionary_to_list
应该创建一个由字典的键组成的列表,按值排序。如果该值不是单个整数而是整数列表,则该键应在相应的排序位置多次出现在列表中。
我的解决方案如下:
def dictionary_to_list(d):
"""inputs a dictionary a:i or a:[i,j], outputs a list of a sorted by i"""
#Converts i to [i] as value of dictionary
for a in d:
if type(d[a])!=type([0,1]):
d[a] = [d[a]]
#Reverses the dictionary from {a:[i,j]...} to {i:a, j:a,...}
reversed_d ={i:a for a in d for i in d[a]}
return [x[1] for x in sorted(reversed_d.items(), key=lambda x:x[0])]
def list_to_dictionary(x):
d = {}
for i in range(len(x)):
a = x[i]
if a in d:
d[a].append(i)
else:
d[a]=[i]
#Creates {a:[i], b:[j,k],...}
for a in d:
if len(d[a])==1:
d[a] = d[a][0]
#Converts to {a:i, b:[j,k],...}
return d
由于与我的其余代码的交互,我无法将问题更改为长度为 1 的列表代替单个整数作为字典的值。似乎应该有一种简单的方法来处理这个问题,但我无法弄清楚。这里更好的解决方案将有几个适用于我的 python 脚本的应用程序。
谢谢