重复列表项以达到所需长度

10

我有一个可用项目列表,可以用来创建一个总长度为4的新列表。可用项目列表的长度从不超过4个项目。如果列表少于4个元素,我希望用从开始元素开始的可用元素填充它。

示例1:

available_items = [4, 2]
Result -> [4, 2, 4, 2]

例子 2:

available_items = [9, 3, 12]
Result -> [9, 3, 12, 9]

示例 3:

available_items = [3]
Result -> [3, 3, 3, 3]

我感觉我的解决方案并不是最优的,但是目前我还没有找到更好的:

available_items = [3, 5]
required_items = 4

if len(available_items) == 1:
  new_items = [available_items[0]] * required_items
else:
  new_items = available_items + []
  for i in range(required_items - len(available_items)):
    new_items.append(available_items[i])

print(new_items)
11个回答

7

您可以使用itertools.cycle

示例:

from itertools import cycle

available_items_1 = cycle([4, 2])
available_items_2 = cycle([9, 3, 12])
available_items_3 = cycle([3])

n = 4

print([next(available_items_1)for i in range(n)])
print([next(available_items_2)for i in range(n)])
print([next(available_items_3)for i in range(n)])

输出:

[4, 2, 4, 2]
[9, 3, 12, 9]
[3, 3, 3, 3]

为什么 next(cycle([5, 6, 7, 8])) 只重复第一个项目? - Ynjxsjmh

6

使用一些整数运算而不是导入库的替代解决方案:

def repeat_items(l, c):
    return l * (c // len(l)) + l[:(c % len(l))]

>>> repeat_items([1, 2, 3], 4)
[1, 2, 3, 1]

避免复制比必要更多的元素(如果len(l)很大而c很小,则特别有益)。 注意:不检查空列表

1
我喜欢这个方法,因为它比迭代“c”次需要更少的计算工作,但也不会使列表比必要的更大。 - jdehesa

4
一个不错的一行代码(省略了任何导入的必要性)是:
[available_items * required_items][0][:required_items]

在您的示例列表上进行测试,我们将获得您想要的结果。

required_items = 4

available_items = [4, 2]
[available_items * required_items][0][:required_items]
# Result -> [4, 2, 4, 2]

available_items = [9, 3, 12]
[available_items * required_items][0][:required_items]
# Result -> [9, 3, 12, 9]

available_items = [3, 3, 3, 3]
[available_items * required_items][0][:required_items]
# Result -> [3, 3, 3, 3]

3
使用 itertools.cycle,你可以这样做:
from itertools import cycle

available_items = [3, 5]
required_items = 4

[item for item, idx in zip(cycle(available_items), range(required_items))]

# [3, 5, 3, 5]

3

试试这个:

lst1=[4,2]
lst2=[9, 3, 12]
lst3=[3]
no_item=4
print([lst1[i%len(lst1)] for i in range(no_item)])
print([lst2[i%len(lst2)] for i in range(no_item)])
print([lst3[i%len(lst3)] for i in range(no_item)])

2

将输入值相乘并限制结果通常更简单。 示例1:


>> available_items = [4, 2]
>> Result = available_items * 4
>> Result = Result[0:4]
>> Result
[4, 2, 4, 2]

Example 2:

>> available_items = [9, 3, 12]
>> Result = available_items * 4
>> Result = Result[0:4]
>> Result
[9, 3, 12, 9]

例子三:

>> available_items = [3]
>> Result = available_items * 4
>> Result = Result[0:4]
>> Result
[3, 3, 3, 3]

2
def solve(arr):
    res = []
    req = 4-len(arr)

    while req>0:
      for i in range(len(arr)):
        res.append(arr[i])
        req = req-1
        if req == 0:
          break

    return arr+res

num = [4, 2]
res_num = solve(num)
print(res_num)

num = [9, 3, 12]
res_num = solve(num)
print(res_num)

num = [3]
res_num = solve(num)
print(res_num)

Output:

[4, 2, 4, 2]
[9, 3, 12, 9]
[3, 3, 3, 3]

2
这里是另一个一行代码解决的例子:

result = (available_items * (int(required_items /len(available_items ))+1))[:required_items]

这应该可以在不考虑“required_items”和“available_items”的情况下正常工作。最初的回答。

2

只需将列表重复4次,并将其减少到4个元素:

最初的回答:只要将列表重复4次,然后将它缩小为4个元素。

>>> i = [4, 2]
>>> (i * 4)[:4]
[4, 2, 4, 2]

2
您可以使用 itertools.cycleitertools.islice 创建所需的列表。 list(islice(cycle(available_items), 4)) 可以实现此功能。"Original Answer"的翻译是"最初的回答"。
>>> lst = [1]; list(islice(cycle(lst), 4)) == [1,1,1,1]
>>> lst = [1,3]; list(islice(cycle(lst), 4)) == [1,3,1,3]
>>> lst = [1,3,2]; list(islice(cycle(lst), 4)) == [1,3,2,1]
>>> lst = [1,3,2,4]; list(islice(cycle(lst), 4)) == [1,3,2,4]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接