Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按所需长度重复列表中的项目_Python - Fatal编程技术网

Python 按所需长度重复列表中的项目

Python 按所需长度重复列表中的项目,python,Python,我有一个可用项目的列表,可以用来创建一个总长度为4的新列表。可用项目列表的长度从不超过4个项目。如果列表中的元素少于4个,我想用从开始元素开始的可用元素填充它 例1: available_items = [4, 2] Result -> [4, 2, 4, 2] >> available_items = [4, 2] >> Result = available_items * 4 >> Result = Result[0:4] >> Res

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

例1:

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

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

available_items = [3]
Result -> [3, 3, 3, 3]
>> available_items = [3]
>> Result = available_items * 4
>> Result = Result[0:4]
>> 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)

您可以使用
itertools.cycle

Ex:

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]
输出:

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]

更简单的是,总是将输入相乘并限制结果。 例1:

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

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

available_items = [3]
Result -> [3, 3, 3, 3]
>> available_items = [3]
>> Result = available_items * 4
>> Result = Result[0:4]
>> Result
[3, 3, 3, 3]
一条漂亮的单行线(省略任何进口的必要性)是:

[可用项目*必需项目][0][:必需项目]
在您的示例列表上进行测试,我们会得到您想要的结果

所需项目=4
可用项目=[4,2]
[可用项目*必需项目][0][:必需项目]
#结果->[4,2,4,2]
可用项目=[9,3,12]
[可用项目*必需项目][0][:必需项目]
#结果->[9,3,12,9]
可用项目=[3,3,3,3]
[可用项目*必需项目][0][:必需项目]
#结果->[3,3,3,3]

使用整数数学代替导入的替代解决方案:

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
较小,则这一点尤其有益)

注意:不检查空列表

输出:

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

这是另一个oneliner:

result = (available_items * (int(required_items /len(available_items ))+1))[:required_items]
无论
所需项目
可用项目

如何使用,这都应该有效,您可以执行以下操作:

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]

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

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

您可以使用
itertools.cycle
itertools.islice
创建所需列表。
列表(islice(循环(可用项目),4))

这是我的尝试

available_items = [3, 5, 9]
required_items = 4

times = 4 // len(available_items)
remain = 4 % len(available_items)

new_items = (available_items * times ) + available_items[:remain]
print(available_items)
print(new_items)
试试这个:

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)])

我喜欢这样做,因为它比迭代
c
次所需的计算工作量要少,但也不会使列表超出需要。