以下です。
python
1>>> a = [0.4, 0.8, 2.3]
2>>> b = [0.3, 0.6]
3>>> c = [2, 2.1, 3.4, 4.4]
4>>> d = [0.4, 0.7]
5>>>
6>>> abcd = [a, b, c, d]
7>>>
8>>> all_set = {}
9>>> for i, lst in enumerate(abcd):
10... for x in lst:
11... if x in all_set:
12... all_set[x].append(i)
13... else:
14... all_set[x] = [i]
15...
16>>> all_list = sorted(all_set.items(), key=lambda item: item[0])
17>>>
18>>> result1 = [x for x, y in all_list]
19>>> result2 = [y for x, y in all_list]
20>>> print(result1)
21[0.3, 0.4, 0.6, 0.7, 0.8, 2, 2.1, 2.3, 3.4, 4.4]
22>>> print(result2)
23[[1], [0, 3], [1], [3], [0], [2], [2], [0], [2], [2]]
追加回答
なるべく、機械命令で実行する部分を増やすために、numpyとpandasを使った方法です。
numpyを使っているため、「0.4という値が0番目(a)・3番目(b)どちらにもあるので,同率ということで[0,3]という書き方」はやっていません。それをやると遅くなります。
python
1>>> import numpy as np
2>>> import pandas as pd
3>>>
4>>> a = np.array([0.4, 0.8, 2.3])
5>>> b = np.array([0.3, 0.6])
6>>> c = np.array([2, 2.1, 3.4, 4.4])
7>>> d = np.array([0.4, 0.7])
8>>>
9>>> abcd = [a, b, c, d]
10>>>
11>>> num_elements = sum([len(e) for e in abcd])
12>>> all_array = np.zeros(2 * num_elements).reshape(num_elements, 2)
13>>>
14>>> start = 0
15>>> for i, a in enumerate(abcd):
16... end = start + len(a)
17... all_array[start:end, 0] = a
18... all_array[start:end, 1] = i
19... start = end
20...
21>>> df = pd.DataFrame(all_array)
22>>> df.sort_values(0, inplace=True)
23>>> print(df)
24 0 1
253 0.3 1.0
260 0.4 0.0
279 0.4 3.0
284 0.6 1.0
2910 0.7 3.0
301 0.8 0.0
315 2.0 2.0
326 2.1 2.0
332 2.3 0.0
347 3.4 2.0
358 4.4 2.0
36>>> result1 = df[0].values
37>>> result2 = df[1].values.astype(int)
38>>> print(result1)
39[0.3 0.4 0.4 0.6 0.7 0.8 2. 2.1 2.3 3.4 4.4]
40>>> print(result2)
41[1 0 3 1 3 0 2 2 0 2 2]
最初の回答よりは速いと思います。