我有两个列表:
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)]
它是如何工作的:
- 确定
k
的值,使得len(A) == k * len(B)
- 迭代
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
repeat
和 chain.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/