Ok, так что я пытаюсь написать функцию Python, которая превращает первую строку здесь, список вложенных кортежей, во вторую линию, сплющенный словарь:Python преобразовать список вложенных кортежей в Словарь
[('Ka',0.6), ('La', 0.6), (('Ma', 0.7), ('Na', 0.8), ('Oa', 0.9))]
{'La': 0.6, 'Ma': 0.7, 'Ka': 0.6, 'Na': 0.8, 'Oa': 0.9}
Небольшое осложнение состоит в том, что внешние кортежи в списке являются членами разных объектов и что аргумент функции представляет собой список этих объектов. Надеюсь, приведенный ниже код объясняет это.
Теперь я на самом деле удалось сколотить решение этой проблемы, но это настолько отвратительное, что я должен спросить, как сделать это в более вещий/менее запутанным образом:
def theFunction(args):
# Please don't ask me how this works. It just does.
flatten = lambda *n: (e for a in n for e in (flatten(*a) if
isinstance(a, (tuple, list)) else (a,)))
return dict(list(zip(*([iter(list(flatten(list(l.sn for l in args))))]*2))))
class le:
def __init__(self,n):
self.sn = (n,0.6)
class lf:
def __init__(self,n,m,o):
self.sn = (n,0.7), (m,0.8), (o, 0.9)
l1 = le("Ka")
l2 = le("La")
l3 = lf("Ma","Na","Oa")
theList = [l1,l2,l3]
print([l.sn for l in theList])
print(theFunction(theList))
Два print statements производят вывод двух строк в верхней части вопроса.
правильный ответ, чтобы исправить вашу структуру данных .... –
'Dict (список (застежка-молния (* ([iter (list (flatten (list (l.sn для l в args))))] * 2)))) 'довольно Pythonic. то же самое с 'flatten = lambda * n: (e для a в n для e in (flatten (* a), если isinstance (a, (кортеж, список)) else (a,)))' и '[l.sn для l в списке]. Но, по общему признанию, уродливый. Как сказал Джоаран, это из-за формата вашей входной структуры. –
Принял ответ от сеншина, который действительно является (очень маленьким) изменением в моей структуре данных. –