如何在满足某些条件的列表中找到第 n 个顺序值的索引?
How can I find the index of the n-th sequential value in a list that meets some criteria?
我试图在列表中查找大于特定数字的第三个连续值的索引。例如在下面的示例中,我想确定有 3 个值大于 1 的索引,这将 return 索引的值为 1.4。使用我在下面尝试过的代码,我正在检索 1.3 值。
我试过使用枚举,但是这个 return 是第三个索引总数,而不是第三个顺序值。
有没有办法识别大于 1 的连续第三个值?
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = [i for i, n in enumerate(listtest) if n >= 1 ][2]
print(listtest[indexBDF])
上面的代码 returns 1.3 因为它是第三个大于 1 的值。我希望代码为 return 1.4,因为它是连续第三个大于 1 的值.
您可以使用 zip()
、enumerate()
、all()
和 for 循环将值分析为三元组:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
for idx, values in enumerate(zip(listtest, listtest[1:], listtest[2:]), start=2):
if all(val > 1 for val in values):
print(f'found 3 sequential values {values} > 1 at index: {idx}')
break
输出:
found 3 sequential values (1.2, 1.3, 1.4) > 1 at index: 5
只需使用传统的for
循环即可解决此问题:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
occurrences = 0
for index,elem in enumerate(listtest):
if elem > 1:
occurrences += 1
if occurrences == 3:
print("Element =", elem)
print("Index =", index)
occurrences = 0
else:
occurrences = 0
输出:
Element = 1.4
Index = 5
如果你想打印所有可能的组合,你可以试试这个:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
for index,num in enumerate(listtest):
if index+3 < len(listtest) + 1:
num_lst = listtest[index:index+3]
if all(num > 1 for num in num_lst):
print("Element =",num_lst[-1],", Index =", index+2)
输出:
Element = 1.4 , Index = 5
Element = 2 , Index = 6
Element = 1.6 , Index = 7
此实现提供了一种通用方法来查找满足某些任意过滤条件的第 n 个连续元素,并且适用于包含任何数据类型的列表。
def nth_seq_item_index(item_list: list, n: int, filter: callable):
"""The nth item `n` starts at 1 (i.e. 1st sequential item). The `filter`
is a function returning True or False for an item in the list."""
if n < 1:
raise ValueError("n must be greater than 0")
consec_count = 0
for index, item in enumerate(item_list):
if filter(item):
consec_count += 1
else:
consec_count = 0
if consec_count == n:
return index
return None
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = nth_seq_item_index(listtest, n=3, filter=lambda i: i >= 1)
print(listtest[indexBDF])
输出
1.4
使用 itertools
的有点难看的版本:
>>> next(i
for k, g in groupby(enumerate(listtest), lambda x: x[1] >= 1)
if k
for i, _ in islice(g, 2, None))
5
这会找到满足条件的连续项目组,然后尝试读取组中的第三个项目。第一个就是结果。
我试图在列表中查找大于特定数字的第三个连续值的索引。例如在下面的示例中,我想确定有 3 个值大于 1 的索引,这将 return 索引的值为 1.4。使用我在下面尝试过的代码,我正在检索 1.3 值。
我试过使用枚举,但是这个 return 是第三个索引总数,而不是第三个顺序值。
有没有办法识别大于 1 的连续第三个值?
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = [i for i, n in enumerate(listtest) if n >= 1 ][2]
print(listtest[indexBDF])
上面的代码 returns 1.3 因为它是第三个大于 1 的值。我希望代码为 return 1.4,因为它是连续第三个大于 1 的值.
您可以使用 zip()
、enumerate()
、all()
和 for 循环将值分析为三元组:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
for idx, values in enumerate(zip(listtest, listtest[1:], listtest[2:]), start=2):
if all(val > 1 for val in values):
print(f'found 3 sequential values {values} > 1 at index: {idx}')
break
输出:
found 3 sequential values (1.2, 1.3, 1.4) > 1 at index: 5
只需使用传统的for
循环即可解决此问题:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
occurrences = 0
for index,elem in enumerate(listtest):
if elem > 1:
occurrences += 1
if occurrences == 3:
print("Element =", elem)
print("Index =", index)
occurrences = 0
else:
occurrences = 0
输出:
Element = 1.4
Index = 5
如果你想打印所有可能的组合,你可以试试这个:
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
for index,num in enumerate(listtest):
if index+3 < len(listtest) + 1:
num_lst = listtest[index:index+3]
if all(num > 1 for num in num_lst):
print("Element =",num_lst[-1],", Index =", index+2)
输出:
Element = 1.4 , Index = 5
Element = 2 , Index = 6
Element = 1.6 , Index = 7
此实现提供了一种通用方法来查找满足某些任意过滤条件的第 n 个连续元素,并且适用于包含任何数据类型的列表。
def nth_seq_item_index(item_list: list, n: int, filter: callable):
"""The nth item `n` starts at 1 (i.e. 1st sequential item). The `filter`
is a function returning True or False for an item in the list."""
if n < 1:
raise ValueError("n must be greater than 0")
consec_count = 0
for index, item in enumerate(item_list):
if filter(item):
consec_count += 1
else:
consec_count = 0
if consec_count == n:
return index
return None
listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = nth_seq_item_index(listtest, n=3, filter=lambda i: i >= 1)
print(listtest[indexBDF])
输出
1.4
使用 itertools
的有点难看的版本:
>>> next(i
for k, g in groupby(enumerate(listtest), lambda x: x[1] >= 1)
if k
for i, _ in islice(g, 2, None))
5
这会找到满足条件的连续项目组,然后尝试读取组中的第三个项目。第一个就是结果。