我在Python中有一个数字列表。它看起来像这样:
a = [87, 84, 86, 89, 90, 2014, 1000, 1002, 997, 999]
我希望将所有数字保持在彼此的+或-7之内并丢弃其余的数字。有没有一种简单的方法在Python中执行此操作?我已经阅读了关于列表过滤方法的内容,但我不确定如何获得我想要使用它的内容。
我是Python的新手。
更新
理想情况下,输出为[84,86,87,89,90]和另一个列表[997,999,1000,1002]。我想检索序列而不是异常值。希望这是有道理的。
答案 0 :(得分:1)
这是算法问题,试试这个:
def get_blocks(values):
mi, ma = 0, 0
result = []
temp = []
for v in sorted(values):
if not temp:
mi = ma = v
temp.append(v)
else:
if abs(v - mi) < 7 and abs(v - ma) < 7:
temp.append(v)
if v < mi:
mi = v
elif v > ma:
ma = v
else:
if len(temp) > 1:
result.append(temp)
mi = ma = v
temp = [v]
return result
a = [87, 84, 86, 89, 90, 2014, 1000, 1002, 997, 999]
print get_blocks(a)
输出:
[[84, 86, 87, 89, 90], [997, 999, 1000, 1002]]
答案 1 :(得分:1)
如果你的问题允许传递关系,即x在群组中,只要它与群组中的任何元素最多7个,那么这在我看来就像{ {3}}问题。更具体地说,您需要找到所有graph theory。
使用递归算法很容易解决问题本身。您首先要创建一个字典,其中每个键都是其中一个元素,每个值都是一个元素列表,与该元素相距最多7个。对于你的例子,你会有这样的事情:
for element in elements:
connections[element] = []
visited[element] = False
for another in elements:
if abs(element - another) <= limit:
connections[element].append(another)
哪会给你这样的东西
{
84: [86, 87, 89, 90],
86: [84, 87, 89, 90],
...
997: [999, 1000, 1002]
...
2014: []
}
现在你需要编写一个递归函数,它将把元素和列表作为输入,只要它能找到一个与当前元素最多7的元素,它就会继续在列表中添加元素。
def group_elements(element, group):
if visited[element]:
return
visited[element] = True
group.append(element)
for another in connections[element]:
group_elements(another, group)
在代码的某处,您还需要记住您已访问过的元素,以确保您不会进入无限循环。
visited = {}
您需要为列表中的每个元素调用该函数。
groups = []
for element in elements:
if not visited[element]:
group = []
group_elements(element, group)
groups.append(group)
print group
此代码应为您的输入提供以下输出:
[[87, 84, 86, 89, 90], [2014], [1000, 1002, 997, 999]]
答案 2 :(得分:0)
a = [87, 84, 86, 89, 90, 2014, 1000, 1002, 997, 999]
temp=a[0]
result=[]
temp1=[]
counter =len(a)
for i in a:
if i in range(temp-7,temp+7):
temp1.append(i)
if counter==1:
result.append(temp1)
else:
if temp1:
result.append(sorted(temp1))
temp1=[]
temp=i
counter=counter-1
print result
答案 3 :(得分:0)
对于这样的问题,我的第一个停靠点是Python itertools module。我在代码中使用的该链接的成对函数可在more-itertools module中找到。
from more_itertools import pairwise
results = []
chunk = []
a = [87, 84, 86, 89, 90, 2014, 1000, 1002, 997, 999]
a.sort()
for v1, v2 in pairwise(a):
if v2 - v1 <= 7:
chunk.append(v1)
elif chunk:
chunk.append(v1)
results.append(chunk)
chunk = []
print(results)
[[84, 86, 87, 89, 90], [997, 999, 1000, 1002]]
我没有测试边缘情况,所以买家要注意:)