我正在尝试执行以下操作:
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)
答案 0 :(得分:2)
为什么不这样做呢?
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
答案 1 :(得分:2)
我首先要清除您似乎有的疑问。
首先,如何在另一个函数中使用函数的值:
您无需在此处将方法的引用传递给另一个方法。我的意思是,在amountOfHashes(count_range_in_list,ctr)
中,您可以仅将count_range_in_list
作为参数,并像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
中包含的内容,因此可以针对打印方法,它同时调用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
答案 2 :(得分:1)
可以通过以下方式对列表中的数字进行计数:
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)*'#')
####
答案 3 :(得分:0)
有很多方法可以做到这一点。一种方法是使用带有范围的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))