Python按一个元素拆分列表

时间:2015-04-10 14:43:35

标签: python list

我正在使用Python分析数据,我有一个N 2d数据数组列表。我想逐一看一下这些元素,并将它们与其他N-1元素的平均值进行比较。

Python中是否有内置方法循环遍历列表,一方面是单个元素,另一方面是列表的其余部分。

我知道怎么做“丑陋的''通过循环整数并连接左右部分的方式:

for i in xrange(N):
    my_element = my_list[i]
    my_sublist = my_list[:i] + my_list[i+1:]

但有没有Pythonista方式呢?

3 个答案:

答案 0 :(得分:3)

我们可以计算所有元素的总和。然后我们可以轻松地为每个元素找到其余元素的总和。我们从总和中减去当前元素的值,然后为了找到我们除以N - 1的平均值:

s = sum(my_list)
for my_element in my_list:
    avg_of_others = (s - my_element) / float(len(my_list) - 1)
    ...

修改

这是一个如何扩展到numpy的示例:

import numpy as np
l = np.array([(1, 2), (1, 3)])
m = np.array([(3, 1), (2, 4)])
my_list = [l, m]

s = sum(my_list)
for my_element in my_list:
    avg_of_others = (s - my_element) / float(len(my_list) - 1)

答案 1 :(得分:1)

我所知道的没有任何内置内容,但使用生成器可能会少一些复制:

def iwithout(pos, seq):
    for i, elem in enumerate(seq):
        if i != pos:
            yield elem


for elem, others in (elem, iwithout(i, N) for i, elem in enumerate(N)):
    ...
    # others is now a generator expression running over N
    # leaving out elem

答案 2 :(得分:1)

  

我想逐一查看这些元素,并将它们与其他N-1元素的平均值进行比较。

对于此特定用例,您应该只计算整个列表的总和一次,然后减去当前元素以计算平均值,如JuniorCompressor's answer中所述。

  

Python中是否有内置方法循环遍历列表,一方面是单个元素,另一方面是列表的其余部分。

对于更一般的问题,您可以使用collections.dequepop来自一端的下一个元素,为您提供该元素和列表中的其余元素,然后将其添加回在循环的下一次迭代之前的另一端。这两个操作都是 O(1)

my_queue = collections.deque(my_list)
for _ in enumerate(my_list):
    my_element = my_queue.popleft() # pop next my_element
    my_sublist = my_queue           # rest of queue without my_element
    print my_element, my_sublist    # do stuff...
    my_queue.append(my_element)     # re-insert my_element

my_list = range(5)的示例输出:

0 deque([1, 2, 3, 4])
1 deque([2, 3, 4, 0])
2 deque([3, 4, 0, 1])
3 deque([4, 0, 1, 2])
4 deque([0, 1, 2, 3])