Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python根据子列表值重新排列列表中的元素_Python_List_Sorting_Sublist_Compare And Swap - Fatal编程技术网

python根据子列表值重新排列列表中的元素

python根据子列表值重新排列列表中的元素,python,list,sorting,sublist,compare-and-swap,Python,List,Sorting,Sublist,Compare And Swap,我有一个列表,我想根据它的子列表的值重新排列 list = [["c","d"], ["b", "c"], ["a", "b"], ["x", "y"]] 最终产品应如下所示: new_list = [["a", "b"], ["b", "c"], ["c", "d"], ["x", "y"]] Python代码应该分析列表中的每个元素,并将它们重新排列成一个新列表。具有相同元素的子列表应并排放置,例如[“b”,“c”]应放置在[“a”,“b”]之后,形成一个[“a”,“b”],[“b”,“

我有一个列表,我想根据它的子列表的值重新排列

list = [["c","d"], ["b", "c"], ["a", "b"], ["x", "y"]]
最终产品应如下所示:

new_list = [["a", "b"], ["b", "c"], ["c", "d"], ["x", "y"]]
Python代码应该分析
列表
中的每个元素,并将它们重新排列成一个
新列表
。具有相同元素的子列表应并排放置,例如
[“b”,“c”]
应放置在
[“a”,“b”]
之后,形成一个
[“a”,“b”],[“b”,“c”]

下面是我尝试对列表进行排序的步骤:

列表中的i的
:
如果len(新列表)=0:
新列表。附加(i)
其他:
对于新列表中的j:
如果j[0]==i[1]:
newindex=new_list.index(j)
新列表。插入(新索引,i)
不幸的是,通过上面的代码,我得到了一个无限循环,它被困在else块上


任何关于更好解决方案的建议都是最受欢迎的。谢谢。

基于@Adam.Er8评论(我有同样的想法,但他的例子比我的好):

结果是一片森林。这个想法是用dict
子级->父级
从下到上构建树:

>>> d = {}
>>> for u, v in L:
...     d[v] = u
...     if not u in d.keys():
...         d[u] = None
>>> d
{'m': 'b', 'b': 'a', 'x': 'b', 'c': 'b', 'a': None, 'y': 'x', 'n': 'm'}
现在,倒树很容易:

>>> e = {}
>>> for k, v in d.items():
...     e.setdefault(v, []).append(k)
>>> e
{'b': ['m', 'x', 'c'], 'a': ['b'], None: ['a'], 'x': ['y'], 'm': ['n']}
使用DFS,您可以输出路径:

>>> def dfs(x, stack=[]):
...     if x in e:
...         for y in e[x]:
...             yield from dfs(y, stack + [x])
...     else:
...         yield stack + [x]

>>> P = list(dfs(None))
>>> P
[[None, 'a', 'b', 'm', 'n'], [None, 'a', 'b', 'x', 'y'], [None, 'a', 'b', 'c']]
最后:

>>> for p in P:
...     print(list(zip(p[1:], p[2:])))
[('a', 'b'), ('b', 'm'), ('m', 'n')]
[('a', 'b'), ('b', 'x'), ('x', 'y')]
[('a', 'b'), ('b', 'c')]

通常,在迭代列表时不应修改列表的内容(插入/删除)。您还可以将内置的
sorted
与自定义键函数一起使用。您不能只使用base list.sort()函数吗?我认为这会得到同样的结果?您的排序顺序似乎没有指定。如果您有子列表
[“a”、“b”]、[“a”、“c”]、[“b”、“c”]
?例如
列表=[“b”、“m”]、[“b”、“x”]、[“b”、“c”]、[“a”、“b”]、[“x”、“y”]、[“m”、“n”]
新列表应该是什么?(也就是说,有不止一条路径)。这可能有点类似于a,加深了你想用平行路径做什么。非常感谢你的答案。这很有帮助。今天我学到了一些新东西。
>>> for p in P:
...     print(list(zip(p[1:], p[2:])))
[('a', 'b'), ('b', 'm'), ('m', 'n')]
[('a', 'b'), ('b', 'x'), ('x', 'y')]
[('a', 'b'), ('b', 'c')]