python - 在Python中平均分配和压缩两个不同长度的列表

标签 python list

我有两个列表:

A = ["a","b","c","d","e","f","g","h","i"]
B = [1,2,3]

A 比 B 长 3 倍,所以我想用它来将它们匹配在一起,如下所示:

C = [("a",1"),("b",1"),("c",1),
     ("d",2),("e",2),("f",2),
     ("g",3),("h",3),("i",3)]

因此,A 的前 3 个元素与 B 的第一个元素匹配,A 的后 3 个元素与 B 的第二个元素匹配,依此类推。

此外,这是一个非常简单的示例。我还对当一个列表比另一个列表大一个非整数的数字时如何最好地公平分配元素感兴趣。例如,我的两个列表的长度分别为 10001 和 511 个元素,因此第一个列表比第二个列表大约 19.57。最好我想使用两个列表中的每个元素。

最佳答案

假设A的长度是B的倍数,你可以轻松做到

>>> scale = len(A) // len(B)
>>> [(a, B[i // scale]) for i, a in enumerate(A)] 
[('a', 1),
 ('b', 1),
 ('c', 1),
 ('d', 2),
 ('e', 2),
 ('f', 2),
 ('g', 3),
 ('h', 3),
 ('i', 3)]

它是如何工作的:

  1. 确定 k 的值,使得 len(A) == k * len(B)
  2. 迭代A,并使用k通过将当前索引除以B来确定选择B的哪个值,相应地<

如果长度不是倍数,那么它将抛出一个

IndexError: list index out of range

您可以通过计算 scale 来规避此问题

scale = len(A) // len(B) * len(B)

例如,

A = ["a", "b", "c", "d", "e", "f", "g", "h"]
B = [1, 2, 3]

>>> scale = len(A) // len(B) * len(B)
>>> [(a, B[i // scale]) for i, a in enumerate(A)] 
[('a', 1),
 ('b', 1),
 ('c', 1),
 ('d', 1),
 ('e', 1),
 ('f', 1),
 ('g', 2),
 ('h', 2)]

这是使用 itertools repeatchain.from_iterable 的函数方法。

>>> from itertools import repeat, chain
>>> list(zip(A, chain.from_iterable(zip(*repeat(B, scale)))))
[('a', 1),
 ('b', 1),
 ('c', 1),
 ('d', 2),
 ('e', 2),
 ('f', 2),
 ('g', 3),
 ('h', 3),
 ('i', 3)]

关于python - 在Python中平均分配和压缩两个不同长度的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872517/

相关文章:

python - 使用 MS SQL ODBC 插入时出现语法错误

python - 对存储在 Python 列表中的对象中的值进行寻址

python - 只需要索引 : enumerate or (x)range?

python - 删除列表中的重复列表

java - 如何连接 JavaFX 中的可观察列表?

python - 无服务器:使用私有(private) Python 包作为依赖

python - 使用 PyEZ 在 Juniper 路由器中执行 vty 命令

python - 检查某列的值是否位于 pandas 数据框中的另一个列数组中

python - 如何从 Python 中的唯一列表访问下一个元素

python - 根据 Python 中的一组索引将列表拆分为多个部分