簡體   English   中英

在輸入浮點數范圍內顯示列表列表中的可能元素

[英]Displaying possible elements from list of list within the range of input floats

假設我有一個包含以下內容的列表:

L = [['10.2','9.1','G'],['12.9','7.4','H'],['5.6','4.3','G'],['5.7','4.5','G']]

列表列表中每個列表中的字母代表“類型”之類的內容

在這種情況下,例如python將要求用戶輸入四個以':'分隔的浮點數;

input = 5.5:4.4:5.7:4.7

如清單清單所示,在python處理輸入之前,第三節每個清單中的字母代表一種類型。

例如,在用戶輸入時,python會將輸入的數量與類型'G'的用戶輸入范圍內的列表列表中的值進行比較。

因此,python將根據用戶輸入從列表列表中輸出列表,其中數字在范圍內 所以,

input = 5.5:4.4:5.7:4.6

output = [5.6,4.3] and [5.7,4.5]

注意:輸入由四個以':'分隔的浮點數組成,我們可以假設上半部分是5.5:4.4的集合,下半部分是5.7:4.6的集合。

我嘗試了一下,但是我不知道如何將列表輸出到輸入范圍內。

L = [['10.2','9.1','G'],['12.9','7.4','H'],['5.6','4.3','G'],['5.8','4.5','G']]

userinput = input("Enter floats:")     #example 5.5:4.4:5.7:4.6
strSeparate = userinput.split(':')     
floatInput = [float(i) for i in strSeparate]   #turn input into float
inputList = [floatInput[:2],floatInput[2:]]    #[[5.5,4.4],[5.7,4.6]]

for line in L:
   for val in inputList:#???

輸出格式為:

[[5.6,4.3],[5.7,4.5]]

您可以如下所示進行操作。

首先,用戶輸入在:上分割,將值轉換為浮點數,並創建一個迭代器以幫助將值與zip()配對。 然后將每對與L的范圍進行比較。 如果一對值都在范圍的上限值和下限值之間,則該對在該范圍內。 范圍內的任何對都會添加到results列表中。

L = [['10.2','9.1','G'],['12.9','7.4','H'],['5.6','4.3','G'],['5.8','4.5','G']]

inputs = [float(s) for s in '5.5:4.4:5.7:4.6'.split(':')]
it = iter(inputs)

results = []

for pair in zip(it, it):
    for line in L:
        if line[2] == 'G':
            upper = float(line[0])
            lower = float(line[1])
            if ((lower <= pair[0] <= upper) and
                (lower <= pair[1] <= upper)):
                results.append([upper, lower])

print(results)

這將輸出:

[[5.6, 4.3], [5.8, 4.5]]

請注意,如果有多個輸入對落入一個范圍內,則此代碼將在results包含重復值。 如果不希望這樣做,則可以使用set而不是list作為results ,並將元組添加到set中(因為列表不可散列)。

此外,這還假定L每個子列表的上限和下限是有序的(上下限)。 如果不是這種情況,您可以這樣做:

            upper = float(line[0])
            lower = float(line[1])
            lower, upper = lower, upper if lower <= upper else upper, lower

使用numpy.arange()numpy.any()函數的解決方案:

import numpy as np

L = [['10.2','9.1','G'],['12.9','7.4','H'],['5.6','4.3','G'],['5.7','4.5','G']]
userinput = "5.5:4.4:5.7:4.6"     #example 5.5:4.4:5.7:4.6
floatInput = [float(i) for i in userinput.split(':')]   #turn input into float

result = []
for i in (floatInput[0:2], floatInput[2:]):
    r = np.arange(i[1], i[0], 0.1)   # generating float numbers range
    items = [l[0:2] for l in L
             if isinstance(np.any([r[r >= float(l[0])], r[r >= float(l[1])]]), np.ndarray)
             and l[0:2] not in result]

    if (items): result.extend(items)

print(result)

輸出:

[['5.6', '4.3'], ['5.7', '4.5']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM