我有两个嵌套列表:
l1 = [['a', 'b'], ['d', 'b'], ['b', 'c'], ['a', 'c'], ['c', 'd'], ['b', 'a'], ['d', 'a']]
l2 = [['a', 'alpha'], ['b', 'beta'], ['c', 'gamma'], ['d', 'delta']]
(l1
完全未排序,但l2
按字母顺序排列,如果相关的话。)
基本上我想最终得到另一个这样的列表:
l3 = [['alpha', ['beta', 'gamma']], ['beta', ['alpha', 'gamma'], ['gamma', ['delta']], ['delta', ['alpha']]
所以:合并共享第一个元素的l1
中的列表,然后将l1
中的所有值替换为l2
中的相应值,最后以l3
的方式格式化它们{1}}(嵌套列表,例如['beta', 'gamma']
按字母顺序排列)。
(This question类似于我想要做的但是我无法修改给出的答案以适合我的问题。)
谢谢!
答案 0 :(得分:3)
您可以使用词典(a)将字母映射到单词,(b)合并列表。特别是,请查看collections.defaultdict
以使其更容易一些。
>>> l1 = [['a', 'b'], ['d', 'b'], ['b', 'c'], ['a', 'c'], ['c', 'd'], ['b', 'a'], ['d', 'a']]
>>> l2 = [['a', 'alpha'], ['b', 'beta'], ['c', 'gamma'], ['d', 'delta']]
>>> d2 = dict(l2)
>>> d3 = collections.defaultdict(list)
>>> for x, y in l1:
... d3[d2[x]].append(d2[y])
...
>>> d3
defaultdict(<type 'list'>, {'alpha': ['beta', 'gamma'],
'beta': ['gamma', 'alpha'],
'gamma': ['delta'],
'delta': ['beta', 'alpha']})
如果您希望将结果作为排序列表列表,只需从dict获取items
。
>>> sorted([k, sorted(v)] for k, v in d3.items())
[['alpha', ['beta', 'gamma']],
['beta', ['alpha', 'gamma']],
['delta', ['alpha', 'beta']],
['gamma', ['delta']]]