【问题标题】:Python Array Index - Every X elements?Python 数组索引 - 每个 X 元素?
【发布时间】:2014-09-29 22:04:01
【问题描述】:

所以我有一个奇怪的问题......

我想处理一个数组并从中取出自然四舍五入的索引。

例如,如果你有数组...

pies = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我想把它的每一个第 1.1 个元素都自然地四舍五入。所以在这种情况下:

pies[0::round(1.1x)]

会输出:

[0, 1, 2, 3, 4, 6, 7, 8, 9]

因为它会取出以下四舍五入的位置:

pies[0]->pies[0]
pies[1.1]->pies[1]
pies[2.2]->pies[2]
pies[3.3]->pies[3]
pies[4.4]->pies[4]
pies[5.5]->pies[6]
pies[6.6]->pies[7]
pies[7.7]->pies[8]
pies[8.8]->pies[9]

请注意,我们不是对内容进行四舍五入,而是对索引进行四舍五入。

作为另一个例子,考虑:

pies = [0, 2, 5, 1, 3, 9, 2, 12, 33, 45]
pies[0::round(1.1x)]

会输出:

[0, 2, 5, 1, 3, 2, 12, 33, 45]

我想知道您如何以最“pythonic”的方式做到这一点。

谢谢!

【问题讨论】:

  • 那么你的问题是什么?
  • @miindlek 对不起。我将在其中进行编辑。我想知道您如何以最 Python 的方式完成此操作。

标签: python arrays python-2.7 lambda indexing


【解决方案1】:
In [7]: pies = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [8]: stride=1.1

In [9]: [pies[x] for x in range(len(pies)) for x in [int(round(x*stride))] if x < len(pies)]
Out[9]: [0, 1, 2, 3, 4, 6, 7, 8, 9]

另外,这对于生成器函数来说似乎是一项不错的工作:

def rounding_iterator(seq, stride):
    try:
        i = 0
        while True:
            yield seq[int(round(i*stride))]
            i += 1
    except IndexError:
        pass


pies = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print list(rounding_iterator(pies, 1))
print list(rounding_iterator(pies, 1.1))
print list(rounding_iterator(pies, .9))

结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

【讨论】:

  • 太棒了!这是我接受的答案,因为它考虑到了长度。非常感谢大家!喜欢 python stackoverflow 人群~。
【解决方案2】:

如何将列表中的值乘以 1.1,四舍五入,然后将其转换为 int 以去除小数:

pies = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for pie in pies:
    print int(round(pie * 1.1))

【讨论】:

  • 我没有正确解释这一点。我不在乎价值本身。我想获得具有舍入索引值的每个 xth 元素。数组中的内容应该保持不变。
【解决方案3】:

如果它不需要是一行...

def rounded_indices(ls):
    result = []
    original_index = 0
    new_index = 0
    while new_index < len(ls):
        result.append(ls[new_index])
        original_index += 1
        new_index = int(round(1.1 * original_index))

    return result

>>> pies = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> rounded_indices(pies)
[0, 1, 2, 3, 4, 6, 7, 8, 9]

【讨论】:

    【解决方案4】:

    我已对此进行了编辑,因此您需要使用 1.1 递增索引并将其舍入。对吗?

    如果是这样,应该是这样的:

    >>> pies = [0, 1, 2, 3, 3, 2, 1, 77, 88, 99]
    >>> print [ pies[int(round(x*0.1+x))] for x in xrange(len(pies)-1) ]
    [0, 1, 2, 3, 3, 1, 77, 88, 99]
    
    >>> pies = [0, 2, 5, 1, 3, 9, 2, 12, 33, 45]
    >>> print [ pies[int(round(x*0.1+x))] for x in xrange(len(pies)-1) ]
    [0, 2, 5, 1, 3, 2, 12, 33, 45]
    >>> 
    

    这是你想要的吗?

    与 numpy 相同:

    >>> import numpy as np
    >>> pies = [0, 2, 5, 1, 3, 9, 2, 12, 33, 45]
    >>> print [ pies[int(round(x))] for x in np.arange(0,len(pies)-1,1.1) ]
    [0, 2, 5, 1, 3, 2, 12, 33, 45]
    

    使用 numpy 你可以改变乘数:

    >>> print [ pies[int(round(x))] for x in np.arange(0,len(pies)/1.1,1.1) ]
    [0, 2, 5, 1, 3, 2, 12, 33, 45]
    >>> print [ pies[int(round(x))] for x in np.arange(0,len(pies)/3.3,3.3) ]
    [0]
    >>> print [ pies[int(round(x))] for x in np.arange(0,len(pies)/2.2,2.2) ]
    [0, 5, 3]
    >>> 
    

    【讨论】:

    • 这并没有让我得到第 x 个元素。您似乎是在将内容相乘然后四舍五入。我希望索引本身乘以四舍五入。
    • @VardaElbereth 它实际上是这样做的。尝试 print [ ( x,int(round(x)) ) for x in np.arange(0,len(pies)-1,1.1) ]
    • 如果len(pies) == 20 会发生什么?
    • @rth 实际上,还有最后一个问题。当前,如果您更改乘数,则会出现索引超出范围错误。例如,将其更改为 0.3。
    • @VardaElbereth 我已经为我的帖子添加了答案。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多