![](/img/trans.png)
[英]For a list of numbers and a list of intervals, find the interval in which each number is located
[英]How to find if a number in a list is in a interval of two numbers in a list?
我有兩個相同長度的排序列表,例如:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
我想知道第一個列表的編號是否在第二個列表的一行中由兩個數字組成的區間中。 然后,我希望打印第一個列表的值和間隔。
舉個例子:
3 in range(0,11) # True
5 in range(0,11) # True
15 in range(0,11) # False, next
15 in range(11,22) # True
等等。
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
aux = 0
count = 1
n_iterations = len(first_list)
iteration = 0
while iteration != n_iterations:
iteration += 1
for i in first_list:
counter = first_list.index(i)
try:
interval = range(second_list[aux],second_list[count])
if i in interval:
print(i, 'in', interval)
if i not in interval:
aux += 1
count += 1
interval = range(second_list[aux], second_list[count])
if i in interval:
print(i, 'in' ,interval)
except IndexError:
break
我試過的代碼確實有效。 但它似乎效率低下且“難以閱讀”,必須采用另一種方式來實現。
編輯:由於問題已更新,我稍微更新了我的答案。 我很高興地承認這個解決方案不是最優的,並且比用戶7440787的解決方案花費更多的時間。 我更關注問題的“難以閱讀”而非“低效”部分。
首先,我的答案,然后一些解釋。
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
for low,high in zip(second_list, second_list[1:]):
for val in first_list:
if low <= val <= high:
print("{} is in {}".format(val, (low, high)))
輸出:
3 is in (0, 11)
5 is in (0, 11)
15 is in (11, 22)
19 is in (11, 22)
23 is in (22, 34)
這為您提供簡單優雅,同時仍然可讀。 將所有內容都放在一行上總是一個有趣的挑戰,但是當您將代碼分解為重要部分時,代碼更容易處理。 當然,還有其他方法可以做到這一點,但這顯示了很多python的細節。
zip(second_list, second_list[1:])
遍歷second_list中的對列表。 [1:]
將列表分割為除了它的第一個元素以外的所有元素,而zip
獲取列表的兩個視圖並為每對產生一個元組,然后將其分配給低和高。
low <= val <= high
是C,C ++或C#中的邏輯錯誤,但在python中完全正確。 它被定義為“low <= val和val <= high”,這正是你在這種情況下所尋找的。
使用str.format是在python中輸出所有類型變量的簡單方法。
如果要在第一次打印條目不在列表中時,則需要:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
regions = list(zip(second_list[:-1],second_list[1:]))
n, i = 0, 0
print_stm = '%i %s in range(%i,%i)'
while n < len(regions) and i < len(first_list):
if regions[n][0] <= first_list[i] <= regions[n][1]:
print(print_stm % ((first_list[i], '') + regions[n]))
i+=1
else:
print(print_stm % ((first_list[i], 'not') + regions[n]))
n+=1
結果是:
3 in range(0,11)
5 in range(0,11)
15 not in range(0,11)
15 in range(11,22)
19 in range(11,22)
23 not in range(11,22)
23 in range(22,34)
如果您只想知道first_list
每個條目的間隔,可以將其簡化為:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
regions = zip(second_list[:-1],second_list[1:])
intervals = [ (i, n) for i in first_list for n in regions if n[0] < i < n[1]]
結果是:
[(3, (0, 11)), (5, (0, 11)), (15, (11, 22)), (19, (11, 22)), (23, (22, 34))]
針對由第二個列表定義的所有可能的范圍對的一行解決方案。
你的代碼似乎很好,但這是一個較短的版本:
# define all duo pairs based on `second_list`
all_pairs = [[second_list[p1], second_list[p2]] for p1 in range(len(second_list)) for p2 in range(p1+1,len(second_list))]
results = list()
results.append([[element,"is in", (all_pairs[i][0],all_pairs[i][1])] for element in first_list for i in range(len(all_pairs)) if element in range(all_pairs[i][0],all_pairs[i][1])])
如果我理解正確,上述應該有效。
輸出:
[[[3, 'is in', (0, 11)],
[3, 'is in', (0, 22)],
[3, 'is in', (0, 34)],
[3, 'is in', (0, 43)],
[5, 'is in', (0, 11)],
[5, 'is in', (0, 22)],
[5, 'is in', (0, 34)],
[5, 'is in', (0, 43)],
[15, 'is in', (0, 22)],
[15, 'is in', (0, 34)],
[15, 'is in', (0, 43)],
[15, 'is in', (11, 22)],
[15, 'is in', (11, 34)],
[15, 'is in', (11, 43)],
[19, 'is in', (0, 22)],
[19, 'is in', (0, 34)],
[19, 'is in', (0, 43)],
[19, 'is in', (11, 22)],
[19, 'is in', (11, 34)],
[19, 'is in', (11, 43)],
[23, 'is in', (0, 34)],
[23, 'is in', (0, 43)],
[23, 'is in', (11, 34)],
[23, 'is in', (11, 43)],
[23, 'is in', (22, 34)],
[23, 'is in', (22, 43)]]]
這就是我所做的:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
L = list(zip(second_list[:-1], second_list[1:]))
i = 0
n = 0
interval = L[i]
while n < len(first_list):
nb = first_list[n]
while nb not in range(interval[0],interval[1]):
print(nb, ' is not in range', interval)
i += 1
if i >= len(L):
break
interval = L[i]
if i >= len(L):
break
print(nb, ' is in range', interval)
n += 1
輸出 :
3 is in range(0, 11)
5 is in range(0, 11)
15 is not in range(0, 11)
15 is in range(11, 22)
19 is in range(11, 22)
23 is not in range(11, 22)
23 is in range(22, 34)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.