给定嵌套列表:[1, (1, 2), [3, 4], {5: 6}]
,编写一个程序,将这些元素的元素作为键,将这些元素的位置作为值。
我的代码:(阅读评论)
#!/usr/bin/python
def code(lst):
'''
lst: A nested hybrid list!
type: list
returns: linear dict
'''
d = {}
try:
for i, l in enumerate(lst):
if isinstance(l, list): # I know lists are unhashable
for e in l:
d[e] = i
elif isinstance(l, dict): # I know dicts are unhashable
for e in l.items():
d[e[0]] = i
d[e[1]] = i
else:
d[l] = i
except TypeError, e:
print "invalid key!"
print "Check your nested values"
except Exception, e: # One should catch every possible exception else code fault
printf "My Code fault!"
return d
它正在工作!
称呼:
print code([1, (1, 2), {3: 4}, [5, 6]])
输出:
{(1, 2): 1, 1: 0, 3: 2, 4: 2, 5: 3, 6: 3}
我是 Python 学习者,我编写此代码时假设从列表中获取的键是唯一的,例如[1, 2, [1, 2]]
无效输入。
[问题]
- 我只是想知道:我怎样才能进一步改进我的代码,让它变得更短更快速?
我从“Apress Starting Python”中了解到应该避免使用
isinstance()
. 那么还有其他方法可以编写此代码吗?你能建议我如何改进任意嵌套和混合的代码,例如
# 0 1 2 3 <-- index [1, (1, 2), {3: [4, 5]}, [{6: 7} , 8]]
输出:
{1: 0, (1, 2): 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3} # ^ ^ ^ ^ ^ ^ ^ ^ # index in outer list
我可以处理嵌套在两个级别,但在任何级别嵌套对我来说是不可能的,请提出一个技巧。一个建议就足够了,但应该是 Pythonic。
(第三个问题是我发布这个问题的主要问题)
编辑:
正如@tcaswell指出的那样:
你想怎么处理
[1, {1: 2}]
?1
应该映射到两者0
并1
根据您当前的规则。
为简单起见,我假设此输入无效。"assumption that key fetched from list will be unique"