[英]perform function using values from 2 columns and return result as new column
[英]Using the result from a function in a new one (plus more)
我正在嘗試執行以下操作:
1)計算數據列表中相同數字的數量。 例如:在三個數字之間,包括10和20。
2)用相同的數字“#”代表每個數字范圍的值。 例如:在10到20之間有3個數字= ###。
理想的情況是使兩個值彼此相鄰表示。
不幸的是,我真的無法弄清楚第二步,任何幫助將不勝感激。
我的代碼如下:
def count_range_in_list(li, min, max):
ctr = 0
for x in li:
if min <= x <= max:
ctr += 1
return ctr
def amountOfHashes(count_range_in_list,ctr):
ctr = count_range_in_list()
if ctr == 1:
print ('#')
elif ctr == 2:
print ('##')
elif ctr == 3:
print ('###')
elif ctr == 4:
print ('####')
elif ctr == 5:
print ('#####')
elif ctr == 6:
print ('######')
elif ctr == 7:
print ('#######')
elif ctr == 8:
print ('########')
elif ctr == 9:
print ('#########')
elif ctr == 10:
print ('##########')
data = [90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51]
print(count_range_in_list(data, 0, 10),amountOfHashes)
print(count_range_in_list(data, 10, 20),amountOfHashes)
print(count_range_in_list(data, 20, 30),amountOfHashes)
print(count_range_in_list(data, 30, 40),amountOfHashes)
print(count_range_in_list(data, 40, 50),amountOfHashes)
print(count_range_in_list(data, 50, 60),amountOfHashes)
print(count_range_in_list(data, 60, 70),amountOfHashes)
print(count_range_in_list(data, 70, 80),amountOfHashes)
print(count_range_in_list(data, 80, 90),amountOfHashes)
print(count_range_in_list(data, 90, 100),amountOfHashes)
為什么不這樣做:
Python 3.x:
def amount_of_hashes(ctr):
while ctr > 0:
print('#', end = '')
ctr = ctr-1
Python 2.x:
def amount_of_hashes(ctr):
while ctr > 0:
print '#',
ctr = ctr-1
我將從清除您似乎有的疑問開始。
首先,如何在另一個函數中使用函數的值:
您無需在此處將方法的引用傳遞給另一個方法 。 我的意思是,在amountOfHashes(count_range_in_list,ctr)
您可以僅將count_range_in_list
為參數,並像amountOfHashes(ctr)
一樣amountOfHashes(ctr)
定義。 或者更好的是,在方法名稱中使用蛇形而不是駝峰式,因此您最終得到了amount_of_hashes(ctr)
。 即使你不得不執行count_range_in_list
內amount_of_hashes
,Python是足夠聰明,讓你這樣做,而不必通過函數的引用,因為這兩種方法是相同的文件中了。
為什么只需要點擊ctr
呢? 好了, count_range_in_list
已經返回了一個計數器,這就是我們所需要的。 一個名為ctr
參數。 為此,“在新函數中使用函數的結果”,我們可以:
def amount_of_hashes(ctr):
...
# now, passing the value of count_range_in_list in amount_of_hashes
amount_of_hashes(count_range_in_list(data, 10, 20))
您已經很好地弄清楚了步驟1),因此我們可以立即進行步驟2)。
在Python中,最好動態地考慮迭代過程(例如您的迭代過程),而不是以硬編碼的方式考慮。 也就是說,可以避免使用以下方法避免創建用於檢查相同條件的方法,即它們之間的微小差異,例如amountOfHashes
中的方法:
# Method name changed for preference. Use the name that best fits you
def counter_hashes(ctr):
# A '#' for each item in a range with the length of our counter
if ctr == 0:
return 'N/A'
return ''.join(['#' for each in range(ctr)])
但是,正如羅蘭·史密斯(Roland Smith)指出的那樣,您可以將字符串乘以一個數字,這將完全按照您的想法進行:多次重復該字符串。
>>> 3*'#'
###
因此, 您甚至不需要上面的我的counter_hashes
,只需點擊ctr*'#'
就可以了。 但是為了保持一致,我將通過這個新發現來更改counter_hashes
:
def counter_hashes(ctr):
# will still return 'N/A' when ctr = 0
return ctr*'#' or 'N/A'
出於組織目的,由於您有特定的需求(打印哈希和哈希計數),因此您可能想要正確格式化要print
,可以為print
創建一個特定的方法,該方法同時調用counter_hashes
和count_Range_in_list
並給出之后您將獲得更清晰的結果:
def hash_range(data, min, max):
ctr = count_range_in_list(data, min, max)
hashes = counter_hashes(ctr)
print(f'{hashes} | {ctr} items in range')
這樣的使用和輸出將變為:
>>> data = [90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51]
>>> hash_range(data, 0, 10)
N/A | 0 items in range
>>> hash_range(data, 10, 20)
### | 3 items in range
>>> hash_range(data, 20, 30)
#### | 4 items in range
等等。 如果您只是想立即打印內容,而沒有上面的hash_range
方法,那么如果想要一個單面紙,它會更簡單,但會更冗長/重復:
>>> ctr = count_range_in_list(data, 10, 20)
>>> print(counter_hashes(ctr), ctr)
### 3
可以通過以下方式對列表中的數字進行計數:
def count_range_in_list(li, mini, maxi):
return len([i for i in li if mini <= i <= maxi])
然后進行多個散列甚至更加簡單。 只需將包含哈希符號的字符串乘以數字即可。
print(ount_range_in_list(data, 0, 10)*'#')
IPython中的示例:
In [1]: data = [90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51]
In [2]: def count_range_in_list(li, mini, maxi):
...: return len([i for i in li if mini <= i <= maxi])
...:
In [3]: print(count_range_in_list(data, 0, 10)*'#')
In [4]: print(count_range_in_list(data, 10, 20)*'#')
###
In [5]: print(count_range_in_list(data, 20, 30)*'#')
####
有很多方法可以做到這一點。 一種方法是使用帶范圍的for循環:
# Most basic
def count_range_in_list(li, min, max):
ctr = 0
hashes = ""
for x in li:
if min <= x <= max:
ctr += 1
hashes += "#"
print("There are {0} numbers = {1}".format(ctr, hashes))
# more declarative
def count_range_in_list(li, min, max):
nums = [x for x in li if min <= x <= max]
hashes = "".join(["#" for n in nums])
print("There are {0} numbers = {1}".format(len(nums), hashes))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.