我有一个列表,我需要找到并提取新列表附近的所有数字。
例如我有一个列表:
1,5,10,8,11,14,15,11,14,1,4,7,5,9
所以,如果我想要提取所有接近3的数字(只有3,间隙必须是3,所以11,14是正确的,11,13不是。)彼此靠近我怎么能设计这个没有硬 - 编码整个事情?
结果应如下所示: 8,11,14,11,14,1,4,7
这看起来并不太难,但我有点卡住了,我能想出的是一个循环,它检查循环的n + 1个成员,如果它超过n乘以3并包含n + 1个成员在一个新的列表中,但是如果有一串需要的数字,我不知道如何包括n成员而不使它在新列表中出现两次。
任何想法?
答案 0 :(得分:2)
只需遍历列表,检查下一个和上一个元素,如果它与任何一个元素相差3,则保存当前元素。在Python中,那是
>>> l = [1,5,10,8,11,14,15,11,14,1,4,7,5,9]
>>> # pad with infinities to ease the final loop
>>> l = [float('-inf')] + l + [float('inf')]
>>> [x for i, x in enumerate(l[1:-1], 1)
... if 3 in (abs(x - l[i-1]), abs(x - l[i+1]))]
[8, 11, 14, 11, 14, 1, 4, 7]
答案 1 :(得分:1)
在Matlab中
list = [1,5,10,8,11,14,15,11,14,1,4,7,5,9]
然后
list(or([diff([0 diff(list)==3]) 0],[0 diff(list)==3]))
返回
8 11 14 11 14 1 4 7
对于那些不理解的人,Matlab diff(list)
会返回list
中元素的第一个(向前)差异。表达式[0 diff(list)]
填充了与前导0
的第一个差异,以使结果与原始list
的长度相同。其余的应该是显而易见的。
简而言之:提出差异和向后差异,选择差异为3
的元素。
答案 2 :(得分:1)
下面的简单C ++代码:
假设ar
是初始整数的数组,而标记是boolean array
for(int i=1;i<N;i++){
if(ar[i]-ar[i-1]==3){
mark[i]=1;
mark[i-1]=1;
}
}
现在打印有趣的数字,
for(int i=0;i<N;i++){
if(mark[i]==1)cout<<ar[i]<<" ";
}
实施背后的想法是,如果数字与前一个数字的差异为3或者它与下一个数字之间的差异为3,我们将数字标记为有趣。
答案 3 :(得分:0)
这是一个循环:
public List<int> CloseByN(int n, List<int> oldL)
{
bool first = true;
int last = 0;
bool isLstAdded = false;
List<int> newL = new List<int>();
foreach(int curr in oldL)
{
if(first)
{
first = false;
last = curr;
continue;
}
if(curr - last == n)
{
if(isLstAdded == false)
{
newL.Add(last);
isLstAdded = true;
}
newL.Add(curr);
}
else
{
isLstAdded = false;
}
last = curr;
}
return newL;
}
测试您的输入并获得输出
答案 4 :(得分:0)
和Haskell版本:
f g xs = dropWhile (null . drop 1) $ foldr comb [[last xs]] (init xs) where
comb a bbs@(b:bs)
| abs (a - head b) == g = (a:head bbs) : bs
| otherwise =
if null (drop 1 b) then [a] : bs else [a] : bbs
输出:
*Main> f 3 [5,10,8,11,14,15,11,14,1,4,7,5,9]
[[8,11,14],[11,14],[1,4,7]]
*Main> f 5 [5,10,8,11,14,15,11,14,1,4,7,5,9]
[[5,10]]