我正在使用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方式呢?
答案 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.deque
来pop
来自一端的下一个元素,为您提供该元素和列表中的其余元素,然后将其添加回在循环的下一次迭代之前的另一端。这两个操作都是 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])