gpt4 book ai didi

python - 将 Python 列表编码为唯一值的索引

转载 作者:行者123 更新时间:2023-12-02 04:38:55 24 4
gpt4 key购买 nike

我想将任意列表表示为另外两个列表。第一个称为 values,包含原始列表中的唯一元素,第二个称为 codes,包含 values 中的索引原始列表中的每个元素,这样原始列表就可以重构为

orig_list = [values[c] for c in codes]

(注意:这类似于 pandas.Categorical 表示系列的方式)

我创建了下面的函数来进行分解:

def decompose(x):
values = sorted(list(set(x)))
codes = [0 for _ in x]
for i, value in enumerate(values):
codes = [i if elem == value else code for elem, code in zip(x, codes)]
return values, codes

这是可行的,但我想知道是否有更好/更有效的方法来实现这一点(没有双循环?),或者标准库中是否有东西可以为我做到这一点。

<小时/>

更新:

下面的答案很棒,对我的功能有很大的改进。我已经按预期安排了所有工作的时间:

test_list = [random.randint(1, 10) for _ in range(10000)]
functions = [decompose, decompose_boris1, decompose_boris2,
decompose_alexander, decompose_stuart1, decompose_stuart2,
decompose_dan1]
for f in functions:
print("-- " + f.__name__)
# test
values, codes = f(test_list)
decoded_list = [values[c] for c in codes]
if decoded_list == test_list:
print("Test passed")
%timeit f(test_list)
else:
print("Test failed")

结果:

-- decompose
Test passed
12.4 ms ± 269 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
-- decompose_boris1
Test passed
1.69 ms ± 21.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
-- decompose_boris2
Test passed
1.63 ms ± 18.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
-- decompose_alexander
Test passed
681 µs ± 2.15 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
-- decompose_stuart1
Test passed
1.7 ms ± 3.42 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
-- decompose_stuart2
Test passed
682 µs ± 5.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
-- decompose_dan1
Test passed
896 µs ± 19.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

我接受 Stuart 的答案,因为它是最简单且最快的答案之一。

最佳答案

我对这个解决方案非常满意,尽管我仍在努力寻找更好的解决方案。

<小时/>

代码

def decompose(original_list: List[Any]) -> Tuple[List[int], Dict[int, Any]]: 
code_to_elem = dict(enumerate(set(original_list)))
elem_to_code = {v: k for k, v in code_to_elem.items()}
encoded_list = [elem_to_code[elem] for elem in original_list]
return encoded_list, code_to_elem
<小时/>

测试运行

# t_list for test_list
t_list = [1, 2, 19, 3, 2, 19, 2, 3, 19, 1, 1, 3]

t_encoded, t_decoder = decompose(t_list)

t_decoded = [t_decoder[curr_code] for curr_code in t_encoded]

以下是重要变量的内容:

  • t_list: [1, 2, 19, 3, 2, 19, 2, 3, 19, 1, 1, 3]
  • t_encoded:[1, 2, 3, 0, 2, 3, 2, 0, 3, 1, 1, 0]
  • t_decoder:{0: 3, 1: 1, 2: 2, 3: 19}
  • t_decoded: [1, 2, 19, 3, 2, 19, 2, 3, 19, 1, 1, 3]
<小时/>

如果您有任何疑问,请告诉我:)

关于python - 将 Python 列表编码为唯一值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59149850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com