如何复制列表/数组中的特定值?

Posted

技术标签:

【中文标题】如何复制列表/数组中的特定值?【英文标题】:How to duplicate a specific value in a list/array? 【发布时间】:2019-02-18 17:59:29 【问题描述】:

关于如何在 Python 中重复数组中的某个值有什么建议吗? 例如,我只想在array_a 中重复 2:

array_a = [1, 2, 1, 2, 1, 1, 2]

想要的结果是:我重复每个2 并离开1

array_a = [1, 2, 2, 1, 2, 2, 1, 1, 2, 2]  # only the `2` should be repeated

我试过numpy,我可以复制整个数组,但不能复制某个值。

【问题讨论】:

我建议您选择适合您当前学习水平的列表操作教程。有许多方法可以做到这一点,但你提出问题的方式表明你会从更广泛的主题介绍中受益。教程级别的教育超出了 Stack Overflow 的范围。 添加了 numpy 标签,因为 OP 已经使用 numpy 来尝试解决方案。 【参考方案1】:

    遍历数组(python 中的“列表”)

    找号码

    获取匹配数在数组中的位置

    在每个匹配的位置后插入另一个数字

https://docs.python.org/3/reference/compound_stmts.html#for

https://docs.python.org/2/tutorial/datastructures.html#more-on-lists

【讨论】:

这不会覆盖匹配位置后的数字吗?我应该增加数组大小然后移位然后添加元素吗?【参考方案2】:

如果将其转换为列表,则可以循环遍历它,如果它符合您的条件,则添加一个额外的版本。例如:

a = [1,2,1,2,1,1,2]
long_a = []
for x in a:
    long_a.append(x)
    if x == 2:
       long_a.append(x)

【讨论】:

不错的解决方案——尽管调用list 是不必要的。【参考方案3】:

您可以使用dictionary 来表示每个唯一元素以及需要重复的次数。然后使用list comprehension 创建数组:

array_a = [1,2,1,2,1,1,2]

repeat_times = 1:1, 2:2 # 1 is 1 time and 2 is repeated two times

result = [i for i in array_a for j in range(repeat_times[i])]
print(result) 

输出:

[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]

【讨论】:

不错的方法。样式提示:使用_ 表示j 等虚拟变量。【参考方案4】:

这似乎是 generator 的一个很好的用例:

>>> def repeater(iterable, repeat_map):
...     for value in iterable:
...         for i in range(repeat_map.get(value, 1)):
...             yield value
...             
>>> array_a = [1,2,1,2,1,1,2]
>>> list(repeater(array_a, repeat_map=2: 2))
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]

【讨论】:

【参考方案5】:

尝试使用推导式。

array = [1, 2, 1, 2, 1, 1, 2]

element_to_repeat = 2

result = [
    repeats_element
    for repeats in
        ((element,)*2 if element == element_to_repeat else (element,) for element in array)
    for repeats_element in repeats
]

它基本上吐出元组,“重复”,如果不是要重复的元素,则包含一次元素,如果是要重复的元素,则包含两次。然后这些“重复”元组的所有元素都被展平为答案。

【讨论】:

奇怪的反对票,这与赞成票的答案相同。【参考方案6】:

这是一个方便的单行代码,使用itertools 和包含 if 和 else 的列表理解。首先它创建一个嵌套列表(能够在某个位置重复项目),然后它会在最后使用.chain()-method 简单地将其展平:

from itertools import chain
array_a = [1, 2, 1, 2, 1, 1, 2]

list(chain.from_iterable([[item, item] if item == 2 else [item] for item in array_a]))
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]  # output

double 的具体值在 if 语句中。使用乘数(而不是 [item, item])和变量(而不是 2)会使这更容易通用,例如:

from itertools import chain

def repeat_certain_value(array, val, n):
    return list(chain.from_iterable(([i] * n if i == val else [i] for i in array)))

repeat_certain_value([1, 2, 1, 2, 1, 1, 2], 2, 2)
[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]  # output

repeat_certain_value([0, -3, 1], -3, 5)
[0, -3, -3, -3, -3, -3, 1]  # output

虽然这种方法是一种使用内置库的便捷单行方法,但 coldspeed 的方法更快:

%timeit for x in range(1000): repeat_certain_value([1, 1, 1, 2, 2, 2, 3, 3, 3] * 100, 2, 2)
10 loops, best of 3: 165 ms per loop

%timeit for x in range(1000): coldspeeds_solution([1, 1, 1, 2, 2, 2, 3, 3, 3] * 100, 2, 2)
10 loops, best of 3: 100 ms per loop

【讨论】:

【参考方案7】:

使用生成器。

array = [1, 2, 1, 2, 1, 1, 2]

element_to_repeat = 2

def add_repeats(array, element_to_repeat):
    for element in array:
        if element == element_to_repeat:
            yield element
            yield element
        else:
            yield element

result = list(add_repeats(array, element_to_repeat))

【讨论】:

【参考方案8】:

如果您对 numpy 解决方案感兴趣,可以使用 np.repeat 在其自身上重复一个数组。

>>> import numpy as np
>>> np.repeat(array_a, array_a)
array([1, 2, 2, 1, 2, 2, 1, 1, 2, 2])

这仅在您的数据中有 1 和 2 时才有效。对于通用解决方案,请考虑

>>> n_repeats = 2
>>> temp = np.where(np.array(array_a) == 2, n_repeats, 1)
>>> np.repeat(array_a, temp)
array([1, 2, 2, 1, 2, 2, 1, 1, 2, 2])

【讨论】:

太棒了!像往常一样【参考方案9】:

可以尝试列表推导并创建flat 函数:

array_a = [1, 2, 1, 2, 1, 1, 2]
def flat(l):
   newl=[]
   for i in l:
      if isinstance(i,list):
         newl.extend(i)
      else:
         newl.append(i)
   return newl
print(flat([[i]*2 if i==2 else i for i in array_a]))

输出:

[1, 2, 2, 1, 2, 2, 1, 1, 2, 2]

【讨论】:

以上是关于如何复制列表/数组中的特定值?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地复制列表中的特定值

如何在java中打印数组中的最小值? [复制]

当我只想获取字典中的特定值时,如何解码字典值的 JSON 数组?

如何删除 mongodb 特定文档中的数组中的项目? [复制]

如何按 .NET 2.0 中的特定属性对列表进行排序? [复制]

如何使用 Python 中的变量删除列表中特定索引处的元素? [复制]