Print Function
https://www.hackerrank.com/challenges/python-print/problem
打印出123…N 之间的整数
方法一 用 for 循环依次打印出
1 | n = 3 |
123
方法二 用 print 内置函数的参数
1 | n=3 |
123
print()函数
知识点 print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
objects – object 复数形式,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep – 用来间隔多个对象,默认值是一个空格。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file – 要写入的文件对象。
*objects – 表示可以用可变参数
在函数调用时,在 str/list/tuple/range 参数前加 *,意思是把 str/list/tuple/range 序列中的元素一个一个传到函数里面
1 | a = '123456' |
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
ju-p-t-er
ju-p-t-er
ju-p-t-er
1-2-3-4-5-6
# Lists
https://www.hackerrank.com/challenges/python-lists/problem
根据输入执行相应的命令
方法一 if…elif
1 | # 正常思路 |
2
append 9
[9]
方法二 eval()
1 | #简化 |
2
append 9
[‘9’]
[]
[9]
join() 函数
知识点 ‘sep’.join(seq)
将字符串、列表、元组、字典中的元素以指定的字符(分隔符)连接生成一个新的字符串,
sep – 分隔符。可以为空
seq – 要连接的元素序列:字符串、列表、元组、字典。
以sep作为分隔符,将seq所有的元素合并成一个新的字符串。返回一个以分隔符sep连接各个元素后生成的字符串
str.join(sequence) 函数中的 sequence 中的元素必须的字符串,否则会报错
1 | #seq内元素只能是可迭代字符串类型,数字不可以 |
H e l l o W o r l d I a m a p r o g r a m m e r
Hello World I am a programmer
Hello:World:I:am:a:programmer
hello-world-I-am-a-programmer
9,9,9
9
(0,5)
(0)
eval()函数
知识点 eval()函数
将字符串str当成有效的表达式来求值并返回计算结果。所以,结合math当成一个计算器很好用。
1 | #计算字符串中有效的表达式 |
4
4
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
(1, 2, 3, 4)
{1: ‘xx’, 2: ‘yy’}
# List Comprehensions
https://www.hackerrank.com/challenges/list-comprehensions/problem
根据要求属于三维坐标
方法一 for 循环
1 | # 正常思路 |
1
1
1
2
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
方法二 简化方法
1 | # 简化4次input,列表生成式 |
1
1
1
2
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
# Find the Runner-Up Score!
https://www.hackerrank.com/challenges/find-second-maximum-number-in-a-list/editorial
找到列表中第二大的数字
方法一 用 set() , sorted()
1 | n = int(input()) |
5
2 3 6 6 5
5
方法二 不用 set() , sorted()
1 | #最基本的算法 |
5
2 3 6 6 5
5
方法三 collections.Counter()
1 | from collections import Counter |
5
2 3 6 6 5
5
方法四 函数
1 | l = [2, 3, 6, 1, 5] |
5
拓展 求列表最大值
1 | # 列表最大值 |
6
# Nested Lists
https://www.hackerrank.com/challenges/nested-list/problem
找到成绩排名第二的学生
第一种 用字典
1 | #创建数据 |
5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39
[[‘Harry’, 37.21], [‘Berry’, 37.21], [‘Tina’, 37.2], [‘Akriti’, 41.0], [‘Harsh’, 39.0]]
1 | students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41.0], ['Harsh', 39.0]] |
{‘Harry’: 37.21, ‘Berry’: 37.21, ‘Tina’: 37.2, ‘Akriti’: 41.0, ‘Harsh’: 39.0}
Berry
Harry
Berry
Harry
第二种 不用字典 简化
1 | students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41.0], ['Harsh', 39.0]] |
Berry
Harry
第三种
1 | #第三种方法 |
Berry
Harry
迭代嵌套列表
知识点 迭代嵌套列表
1 | students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41.0], ['Harsh', 39.0]] |
[‘Harry’, ‘Berry’, ‘Tina’, ‘Akriti’, ‘Harsh’]
[37.21, 37.21, 37.2, 41.0, 39.0]
[3, 2, 1, 4, 4]
通过字典的value获取其key
知识点 通过字典的value获取其key,这个方法只适合没有相同value的字典
1 | d = {'a':'001', 'b':'002'} |
‘a’
# Finding the percentage
https://www.hackerrank.com/challenges/finding-the-percentage/problem
把学生和3门成绩的平均值一起存在字典中
1 | #创建数据 |
3
Krishna 67 68 69
Arjun 70 98 63
Malika 52 56 60
{‘Krishna’: [67, 68, 69], ‘Arjun’: [70, 98, 63], ‘Malika’: [52, 56, 60]}
1 | scores = {'Krishna': [67, 68, 69], 'Arjun': [70, 98, 63], 'Malika': [52, 56, 60]} |
Krishna
68.00
1 | # 把学生和3门成绩的平均值一起存在字典中 |
3
Krishna 67 68 69
Arjun 70 98 63
Malika 52 56 60
Krishna
68.00
1 | s = 'HackerRan.' |
‘HackerRan.’
1 | s = 'HackerRan.' |
‘hACKERrAN.’
1 | [for i in s if] |
1 | s.swapcase() |
‘hACKERrAN.’
# String Formatting
https://www.hackerrank.com/challenges/python-string-formatting/problem
1 | #第一种方法 |
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
6 6 6 110
7 7 7 111
8 10 8 1000
9 11 9 1001
10 12 A 1010
11 13 B 1011
12 14 C 1100
13 15 D 1101
14 16 E 1110
15 17 F 1111
16 20 10 10000
17 21 11 10001
1 | #第二种方法 |
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
6 6 6 110
7 7 7 111
8 10 8 1000
9 11 9 1001
10 12 a 1010
11 13 b 1011
12 14 c 1100
13 15 d 1101
14 16 e 1110
15 17 f 1111
16 20 10 10000
17 21 11 10001
# Alphabet Rangoli
https://www.hackerrank.com/challenges/alphabet-rangoli/problem
1 | n = 5 |
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’]
——–e——–
——–d——–
——–c——–
——–b——–
——–a——–
——–a——–
——–a——–
——–b——–
——–c——–
——–d——–
——–e——–
1 | n = 5 |
——–a——–
——a-a-a——
—-a-a-a-a-a—-
–a-a-a-a-a-a-a–
a-a-a-a-a-a-a-a-a
–a-a-a-a-a-a-a–
—-a-a-a-a-a—-
——a-a-a——
——–a——–
1 | n = 5 |
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
1 | #方法一 |
[‘e-d-c-b-a-b-c-d-e’, ‘e-d-c-b-c-d-e’, ‘e-d-c-d-e’, ‘e-d-e’, ‘e’]
——–e——–
——e-d-e——
—-e-d-c-d-e—-
–e-d-c-b-c-d-e–
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
1 | #方法二 |
a-b-c-d-e
b-c-d-e
c-d-e
d-e
e
[‘e-d-c-b-a-b-c-d-e’, ‘–e-d-c-b-c-d-e–’, ‘—-e-d-c-d-e—-‘, ‘——e-d-e——‘, ‘——–e——–’]
——–e——–
——e-d-e——
—-e-d-c-d-e—-
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
——–e——–
——e-d-e——
—-e-d-c-d-e—-
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
——–e——–
——e-d-e——
—-e-d-c-d-e—-
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
——–e——–
——e-d-e——
—-e-d-c-d-e—-
e-d-c-b-a-b-c-d-e
–e-d-c-b-c-d-e–
—-e-d-c-d-e—-
——e-d-e——
——–e——–
1 | name = 'chris alan' |
Chris Alan
1 | (' ').join([n.capitalize() for n in name.split(' ')]) |
‘Chris Alan’
title() 与 capitalize() 的区别
capitalize()与title()都可以实现字符串首字母大写.
主要区别在于:
capitalize(): 字符串第一个字母大写
title(): 字符串内的所有单词的首字母大写
1 | # 字母开头的情况 |
Huang bi quan
Huang Bi Quan
深圳luohu
深圳Luohu
1 | print('title()方法') |
title()
Abcd
12Abcd
Ab Cd
capitalize()
Abcd
12abcd
Ab cd
The Minion Game
https://www.hackerrank.com/challenges/the-minion-game/problem
1 | #方法一 但是当string很多的时候,就不行了 |
Stuart 12
1 | #方法二 |
Stuart 12
1 | string = 'BANANA' |
{'N', 'BA', 'B', 'NANA', 'BANAN', 'ANA', 'ANANA', 'BANA', 'BANANA', 'NA', 'BAN', 'A'}
18
1 | string = 'BANANA' |
{'ANAN', 'N', 'BA', 'B', 'NANA', 'BANAN', 'ANA', 'BANA', 'ANANA', 'AN', 'NAN', 'BANANA', 'NA', 'BAN', 'A'}
15
{'Stuart': ['N', 'BA', 'B', 'NANA', 'BANAN', 'BANA', 'NAN', 'BANANA', 'NA', 'BAN'], 'Kevin': ['ANAN', 'ANA', 'ANANA', 'AN', 'A']}
1 | string = 'BANANA' |
['B', 'A', 'N', 'A', 'N', 'A', 'BA', 'AN', 'NA', 'AN', 'NA', 'BAN', 'ANA', 'NAN', 'ANA', 'BANA', 'ANAN', 'NANA', 'BANAN', 'ANANA', 'BANANA']
12 9
Stuart 12
1 | #按照长度切分字符串,变成n个子字符串 |
['B', 'A', 'N', 'A', 'N', 'A']
['BA', 'AN', 'NA', 'AN', 'NA']
['BAN', 'ANA', 'NAN', 'ANA']
['BANA', 'ANAN', 'NANA']
['BANAN', 'ANANA']
['BANANA']
1 | #切分子字符串 |
['B', 'A', 'N', 'A', 'N', 'A', 'BA', 'AN', 'NA', 'AN', 'NA', 'BAN', 'ANA', 'NAN', 'ANA', 'BANA', 'ANAN', 'NANA', 'BANAN', 'ANANA', 'BANANA']
1 | s = 'BANANA' |
Merge the Tools!
https://www.hackerrank.com/challenges/merge-the-tools/problem
1 | string = 'AABCAAADA' |
['AAB', 'CAA', 'ADA']
1 | string = 'AABCAAADA' |
['A', 'B', 'C', 'A', 'D', 'A']
1 | 9/3 |
3.0
1 | #方法一 |
AB
CA
AD
列表生成式理解出错的例子
1 | string = 'AABCAAADA' |
['A', 'B', 'C', 'D']
['A', 'A', 'B', 'C', 'A', 'A', 'A', 'D', 'A']
[None, None, None, None]
['A', 'B', 'C', 'D']
1 | #方法二 |
AB
{'A': 'A', 'B': 'B'}
CA
{'C': 'C', 'A': 'A'}
AD
{'A': 'A', 'D': 'D'}
dict.setdefault(key, default=None)
Python 字典 setdefault() 方法和get()方法类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值。
参数
key – 查找的键值。
default – 键不存在时,设置的默认键值。
返回值
如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
dict.get(key, default=None)
Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值。
参数
key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值值。
返回值
返回指定键的值,如果值不在字典中返回默认值 None。
1 | a = {'A': 'A', 'B': 'B'} |
A
NA
{'A': 'A', 'B': 'B'}
A
NA
{'A': 'A', 'B': 'B', 'C': 'NA'}
iter()函数
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
iterator 对象 迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
zip(iterables)函数
https://docs.python.org/3/library/functions.html#zip
Python3中的zip函数可以把两个或者两个以上的迭代器封装成生成器,这种zip生成器会从每个迭代器中获取该迭代器的下一个值,然后把这些值组装成元组(tuple)。这样,zip函数就实现了平行地遍历多个迭代器。
如果输入的迭代器长度不同,那么,只要有一个迭代器遍历完,zip就不再产生元组了,zip会提前终止,这可能导致意外的结果,不可不察。
zip([iter(s)]n)将数据序列聚类为n长度组的习语成为可能。这重复了相同的迭代器n次,以使每个输出元组具有对迭代器的n次调用的结果。这具有将输入划分为n个长块的效果。
zip() 与 操作符一起可以用来 unzip 一个列表
1 | #很简洁地实现了同时遍历两个列表 |
a is apple
b is boy
c is cat
d is dog
1 | s = 'AABCAAADA' |
[(‘A’, ‘A’, ‘B’), (‘C’, ‘A’, ‘A’), (‘A’, ‘D’, ‘A’)]
1 | l = [1,2,3] |
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[9, 2, 3], [9, 2, 3], [9, 2, 3]]
list.sort() 方法 与 sorted() 函数
sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效
list.sort(key=None,reverse=False) 就地改变列表reverse:True反序;False 正序
sorted 和list.sort 都接受key, reverse定制。但是区别是。list.sort()是列表中的方法,只能用于列表。而sorted可以用于任何可迭代的对象。list.sort()是在原序列上进行修改,不会产生新的序列。所以如果你不需要旧的序列,可以选择list.sort()。 sorted() 会返回一个新的序列。旧的对象依然存在。
Symmetric Difference
https://www.hackerrank.com/challenges/symmetric-difference/problem
1 | M = '2 4 5 9' |
5
9
11
12
1 | M = '2 4 5 9' |
['11', '5', '9', '12']
['11', '12', '5', '9']
['5', '9', '11', '12']
5
9
11
12
1 | #方法一 |
4
2 4 5 9
4
2 4 11 12
5
9
11
12
5 9 11 12
1 | #方法二 简化 |
4
2 4 5 9
4
2 4 11 12
5
9
11
12
1 | #方法三 |
4
2 4 5 9
4
2 4 11 12
5
9
11
12
‘sep’.join(seq)
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组,里面的元素必须是字符串类型
如果是整数类型,
可以先把它转化为字符串类型 print(‘\n’.join(map(str,a)))
或者用 print(*a,sep=’\n’)
1 | a = ['5', '9', '11', '12'] |
5
9
11
12
5
9
11
12
5
9
11
12
5
9
11
12
1 | # 按照数字的大小,从小到大换行打印每一个元素 |
5
9
11
12
5
9
11
12
# No Idea!
https://www.hackerrank.com/challenges/no-idea/problem
1 | #方法一 如果序列太大了,太耗时了 |
1
1 | #方法二 简化 |
1
1 | #方法三 |
[1, -1, 1]
1 | print(int(True)) |
1
0
1 | n,m = list(map(int,input().split(' '))) |
3 2
1 5 3
3 1
5 7
3 2 [1, 5, 3] {1, 3} {5, 7}
1 | n,m = input().split(' ') |
3 2
1 5 3
3 1
5 7
3 2 [‘1’, ‘5’, ‘3’] {‘3’, ‘1’} {‘5’, ‘7’}
1 | n = int(input()) |
7
UK
China
USA
France
New Zealand
UK
France
{‘France’, ‘China’, ‘USA’, ‘UK’, ‘New Zealand’} 5
1 | n = int(input()) |
9
1 2 3 4 5 6 7 8 9
{1, 2, 3, 4, 5, 6, 7, 8, 9}
1 | Eng,Fre = (set(input().split(' ')) for i in range(2)) |
1 2 3 4 5 6 7 8 9
10 1 2 3 11 21 55 6 8
{‘6’, ‘2’, ‘5’, ‘8’, ‘3’, ‘ ‘, ‘7’, ‘9’, ‘4’, ‘1’} {‘6’, ‘2’, ‘5’, ‘0’, ‘8’, ‘3’, ‘ ‘, ‘1’}
{‘4’, ‘7’, ‘9’}
# Set Mutations
https://www.hackerrank.com/challenges/py-set-mutations/problem
方法一 if
1 | num_ele = input() |
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 24 52
{‘10’, ‘2’, ‘12’, ‘7’, ‘11’, ‘4’, ‘13’, ‘6’, ‘3’, ‘8’, ‘1’, ‘14’, ‘52’, ‘24’, ‘5’, ‘9’}
1
intersection_update 10
2 3 5 6 8 9 1 4 7 11
{‘2’, ‘7’, ‘11’, ‘4’, ‘8’, ‘6’, ‘3’, ‘1’, ‘5’, ‘9’}
10
方法二 getattr()
1 | num_ele = input() |
getattr()
getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
可以在后面添加一对括号。
1 | class test(): |
hackerrank
<bound method test.run of <__main__.test object at 0x000001C07C87F390>>
18
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-11-7e96e4c12be7> in <module>()
9 getattr(t, 'run')() #获取run方法,后面加括号可以将这个方法运行
10 print(getattr(t, "age","18")) #若属性不存在,返回一个默认值。
---> 11 print(getattr(t, 'age')) #获取一个不存在的属性
AttributeError: 'test' object has no attribute 'age'
dir()
dir()函数可以查看对像内所有属于及方法,在python中任何东西都是对像,一种数据类型,一个模块等,都有自己的属性和方法,除了常用方法外,其它的你不需要全部记住它,交给dir()函数就好了。
1 | a = {1,2,3,4} |
['__and__',
'__class__',
'__contains__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__iand__',
'__init__',
'__init_subclass__',
'__ior__',
'__isub__',
'__iter__',
'__ixor__',
'__le__',
'__len__',
'__lt__',
'__ne__',
'__new__',
'__or__',
'__rand__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__ror__',
'__rsub__',
'__rxor__',
'__setattr__',
'__sizeof__',
'__str__',
'__sub__',
'__subclasshook__',
'__xor__',
'add',
'clear',
'copy',
'difference',
'difference_update',
'discard',
'intersection',
'intersection_update',
'isdisjoint',
'issubset',
'issuperset',
'pop',
'remove',
'symmetric_difference',
'symmetric_difference_update',
'union',
'update']
The Captain’s Room
https://www.hackerrank.com/challenges/py-the-captains-room/problem
思路一:正常思路,找到出现频率为1次的项
1 | #方法一 循环 |
5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2
{'1': 5, '2': 5, '3': 5, '6': 5, '5': 5, '4': 5, '8': 1}
8
1 | #方法二 fromkeys() |
1 | #方法三 collections.Counter |
5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2
8
1 |
|
{1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}
{1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 1}
Counter({1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 1})
(6, 1)
6
{1, 2, 3, 4, 5, 6}
3
6
思路二:数学思路
L = [1,2,3,4,1,2,3,4,1,2,3,4,5] S = (1,2,3,4,5)
C 是L中只出现一次的5 K 是 [1,2,3,4]在L中出现的次数
L = S * K - (K-1) * C
C = (S * K - L)/(K-1)
1 | k = int(input()) |
5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2
8
思路三:集合差
创建一个包括所有元素的集合,再创建一个包括出现频率超过一次的集合,两个集合求差
A 与 B 的差集是所有属于 A 且不属于 B 的元素构成的集合
1 | k = int(input()) |
5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2
8
思路四:集合对称差 完全想不到
将列表进行排序后,交错分成2个列表,一个奇数列表,一个偶数列表,将这两个列表变成集合后,求对称差
两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。
1 | k = int(input()) |
5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2
8
Check Subset
https://www.hackerrank.com/challenges/py-check-subset/problem
s.issubset(t)
s <= t # 测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t # 测试是否 t 中的每一个元素都在 s 中
1 | # 正常思路求A和B的交集数量是否是还是A的数量 |
1
5
1 2 3 5 6
9
9 8 5 6 3 2 1 4 7
True
1 | # s.issubset(t) |
1
5
1 2 3 5 6
9
9 8 5 6 3 2 1 4 7
True
# Check Strict Superset
https://www.hackerrank.com/challenges/py-check-strict-superset/problem
1 | # 自己的思路 |
True
True
True
True
False
False
1 | # 用all() 函数 和 生成器 generator |
1 2 3 4 5 6 7 8 9 10 11 12 23 45 84 78
2
1 2 3 4 5
100 11 12
False
all() 函数
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否不为 0、’’、False 或者 iterable 为空,如果是返回 True,否则返回 False。
注意:空元组、空列表返回值为True,这里要特别注意。
all函数等价于下列代码段:
1 | def all(iterable): |
1 | print(all(['a', 'b', 'c', 'd']) ) # 列表list,元素都不为空或0 |
True
False
False
True
True
Find Angle MBC
https://www.hackerrank.com/challenges/find-angle/problem
1 | from math import sin |
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-042b1c12f4e0> in <module>()
3 a = 10
4 b = 10
----> 5 print(float(sqrt(a/a**a+b**b)))
6 #print(sin(a/sqrt(a**a+b**b)))
TypeError: can't convert complex to float
itertools.product()
https://www.hackerrank.com/challenges/itertools-permutations/problem
笛卡尔积
product(A, B) returns the same as ((x,y) for x in A for y in B)
1 | from itertools import product |
[(1, 2), (1, 4), (0, 2), (0, 4)]
[(1, 1), (1, 2), (2, 1), (2, 2)]
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
(1, 3) (1, 4) (2, 3) (2, 4)
(1, 3) (1, 4) (2, 3) (2, 4)
itertools.permutations
https://www.hackerrank.com/challenges/itertools-permutations/problem
1 | # permutations 排列 对顺序敏感({1, 2}, {2, 1} 是不同的排列) |
<itertools.permutations object at 0x10edc89e8>
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
--------------combinations---------------------
[(1, 2, 3)]
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
[(1, 1, 3, 3), (1, 1, 3, 3), (1, 1, 3, 3), (1, 3, 3, 3), (1, 3, 3, 3)]
[(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)]
--------------test-----------------------
[('A', 'C'), ('A', 'H'), ('A', 'K'), ('C', 'A'), ('C', 'H'), ('C', 'K'), ('H', 'A'), ('H', 'C'), ('H', 'K'), ('K', 'A'), ('K', 'C'), ('K', 'H')]
AC
AH
AK
CA
CH
CK
HA
HC
HK
KA
KC
KH
--------------等同-----------------------
AC
AH
AK
CA
CH
CK
HA
HC
HK
KA
KC
KH
1 | from itertools import combinations |
[('A',), ('C',), ('H',), ('K',)]
A
C
H
K
AC
AH
AK
CH
CK
HK
itertools.groupby()
1 | from itertools import groupby |
<itertools.groupby object at 0x10ee17048>
collections.Counter()
https://www.hackerrank.com/challenges/collections-counter/problem
1 | from collections import Counter |
Counter({1: 2, 3: 2, 6: 2, 2: 1, 4: 1, 5: 1})
dict_items([(1, 2), (2, 1), (3, 2), (4, 1), (5, 1), (6, 2)])
dict_keys([1, 2, 3, 4, 5, 6])
dict_values([2, 1, 2, 1, 1, 2])
1 | from collections import Counter |
10
2 3 4 5 6 8 7 6 5 18
6
Counter({5: 2, 6: 2, 2: 1, 3: 1, 4: 1, 8: 1, 7: 1, 18: 1})
1 | from collections import Counter |
Counter({5: 2, 6: 2, 2: 1, 3: 1, 4: 1, 8: 1, 7: 1, 18: 1})
6 55
Purchased size 6 shoe for 55
6 45
Purchased size 6 shoe for 45
6 55
Size 6 no longer available,so no purchase
4 40
Purchased size 4 shoe for 40
18 60
Purchased size 18 shoe for 60
10 50
Size 10 no longer available,so no purchase
200
Detect Floating Point Number
https://www.hackerrank.com/challenges/introduction-to-regex/editorial
1 | import re |
True
True
False
False
False
Re.split()
https://www.hackerrank.com/challenges/re-split/problem?h_r=next-challenge&h_v=zen
1 | import re |
100
000
000
000
re.split()
多个分隔符,复杂的分隔情况,使用re.split
原型: re.split(pattern, string, maxsplit=0)
通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。
1 | import re |
['', 'abc', 'cba']
['', '123', 'abc', '321', 'cba']
Group(), Groups() & Groupdict()
https://www.hackerrank.com/challenges/re-group-groups/problem?h_r=next-challenge&h_v=zen
1 | import re |
1
Re.start() & Re.end()
https://www.hackerrank.com/challenges/re-start-re-end/problem
match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
start() 返回匹配开始的位置,子串第一个字符的索引
end() 返回匹配结束的位置,子串最后一个字符的索引+1
span() 返回一个元组包含匹配 (开始,结束) 的位置
1 | # 匹配叠加项, pattern.match(string[, pos[, endpos]]) |
(0, 1)
(1, 2)
(4, 5)
第一种方法,figured it our by myself, 从每一个索引找起
1 | import re |
aaadaa
aa
(0, 1)
(1, 2)
(4, 5)
第二种方法,网站提供的参考方法,从匹配到的项的开头索引下一位作为下一次查找的开头,相对第一种方法,更快捷,不需要从头查找到尾
1 | import re |
(0,1)
(1,2)
(4,5)
第三种方法,论坛用户提供的,用了前瞻 前瞻:exp1(?=exp2) 表示exp1后面的内容要匹配exp2,返回exp1(前瞻), finditer() 匹配aa前面,返回的Match对象中有区间span,
1 | import re |
(0, 1)
(1, 2)
(4, 5)
finderiter() 函数
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。若匹配成功,match()/search()返回的是Match对象,finditer()返回的也是Match对象的迭代器,获取匹配结果需要调用Match对象的group()、groups或group(index)方法。
1 | import re |
[<_sre.SRE_Match object; span=(0, 0), match=''>, <_sre.SRE_Match object; span=(1, 1), match=''>, <_sre.SRE_Match object; span=(4, 4), match=''>]
['', '', '']
Regex Substitution
https://www.hackerrank.com/challenges/re-sub-regex-substitution/problem
1 | # 第一次尝试 部分例子失败 |
a = 1;
b = input();
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
print set(list(a)) | set(list(b))
[' && ', ' || ']
出错的地方在于:如果出现 ‘ || && ‘, ‘ && || ‘,’ || || ‘,’ && && ‘ 两个连续的字符中间只有一个空格时候,上述代码只会匹配第一个,因为两个字符中间的空格已经消耗掉了,第二个就匹配不成功
需要运用了前瞻后顾祝贺 (?<=exp2)exp1(?=exp2)
exp1(?=exp2) 表示exp1后面的内容要匹配exp2,返回exp1(前瞻)
(?<=exp2)exp1 表示exp1前面的内容要匹配exp2,返回exp1 (后顾)
1 | # 第二次尝试 失败 |
a = 1;
b = input();
or and
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
and or
print set(list(a)) | set(list(b))
#Note do not change and& or |or or & or |
#Only change those '&&' which have space on both sides.
#Only change those 'or which have space on both sides.
['||', '&&', '&&', '||', '&&', '||', '&&', '||', '||']
出错的地方在于: 上述代码还成功匹配了’ &&& ‘和’ ||| ‘,原因是 pattern = r’(?<= )&&|||(?= )’ 其实分成了两组,第一组 ?<= )&& 和 第二组 ||(?= ),所以这其实可以匹配4种
‘ || ‘,’ && ‘,’ &&’,’|| ‘
加括号后
pattern = r’(?<= )(&&|||)(?= )
第一种方法
1 | # 第三次尝试 成功 |
a = 1;
b = input();
or and
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
and or
print set(list(a)) | set(list(b))
#Note do not change &&& or ||| or & or |
#Only change those '&&' which have space on both sides.
#Only change those '|| which have space on both sides.
['||', '&&', '&&', '||', '&&', '||']
1 | 第二种方法 第一种方法简化 用匿名函数替换 change 函数 |
1 | import re |
a = 1;
b = input();
or and
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
and or
print set(list(a)) | set(list(b))
#Note do not change &&& or ||| or & or |
#Only change those '&&' which have space on both sides.
#Only change those '|| which have space on both sides.
第三种方法 参考方法
1 | import re |
a = 1;
b = input();
or and
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
and or
print set(list(a)) | set(list(b))
#Note do not change &&& or ||| or & or |
#Only change those '&&' which have space on both sides.
#Only change those '|| which have space on both sides.
re.sub()
re.sub(pattern, repl, string, count=0, flags=0)
1 | import re |
Jamie
James
1 | import re |
[('hello', 'world'), ('hello', 'hz')]
world hello ! hz hello !
1 | import re |
world
Hello, <em>world</em>!
['world', 'good']
Hello, <em>world</em> <em>good</em> !
Validating Roman Numerals
https://www.hackerrank.com/challenges/validate-a-roman-number/problem
1 | import re |
<_sre.SRE_Match object; span=(0, 5), match='CDXXI'>
分解
^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
M{0,4}
This specifies the thousands section and basically restrains it to between 0 and 4000. It’s a relatively simple:
0:
1000: M matched by M{1}
2000: MM matched by M{2}
3000: MMM matched by M{3}
4000: MMMM matched by M{4}
(CM|CD|D?C{0,3})
Slightly more complex, this is for the hundreds section and covers all the possibilities:
0:
100: C matched by D?C{1} (with D not there)
200: CC matched by D?C{2} (with D not there)
300: CCC matched by D?C{3} (with D not there)
400: CD matched by CD
500: D matched by D?C{0} (with D there)
600: DC matched by D?C{1} (with D there)
700: DCC matched by D?C{2} (with D there)
800: DCCC matched by D?C{3} (with D there)
900: CM matched by CM
(XC|XL|L?X{0,3})
Same rules as previous section but for the tens place:
0:
10: X matched by L?X{1} (with L not there)
20: XX matched by L?X{2} (with L not there)
30: XXX matched by L?X{3} (with L not there)
40: XL matched by XL
50: L matched by L?X{0} (with L there)
60: LX matched by L?X{1} (with L there)
70: LXX matched by L?X{2} (with L there)
80: LXXX matched by L?X{3} (with L there)
90: XC matched by XC
(IX|IV|V?I{0,3})
This is the units section, handling 0 through 9 and also similar to the previous two sections (Roman numerals, despite their seeming weirdness, follow some logical rules once you figure out what they are):
0:
1: I matched by V?I{1} (with V not there)
2: II matched by V?I{2} (with V not there)
3: III matched by V?I{3} (with V not there)
4: IV matched by IV
5: V matched by V?I{0} (with V there)
6: VI matched by V?I{1} (with V there)
7: VII matched by V?I{2} (with V there)
8: VIII matched by V?I{3} (with V there)
9: IX matched by IX
Validating and Parsing Email Addresses
1 | import email.utils,re |
DOSHI@hackerrank.com
参考答案提供的正则表达式
^[a-zA-Z][\w-.]*@[A-Za-z]+.[a-zA-Z]{1,3}$
对比自己写的正则
^[A-Za-z]+[A-Za-z0-9-._]+@[A-Za-z]+.[A-Za-z]{1,3}$
\w 等同于[a-z0-9A-Z_]匹配大小写字母、数字和下划线
* 匹配前面的字符0次或多次(>=0)
Hex Color Code
1 | # 第一种方法 |
None
None
None
None
None
None
['#FfFdF8', '#aef', '#f9f9f9', '#fff', '#ABC', '#fff']
#FfFdF8
#aef
#f9f9f9
#fff
#ABC
#fff
对比自己写的
.+?(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{3})
论坛用户提供的正则表达式
(?<!^)(#(?:[\da-fA-F]{3}){1,2})
(?<!exp2)exp1 表示exp1前面的内容不能匹配exp2,返回exp1 (负后顾)
(?<!^) 不从开头匹配
(?:) 不作为分组
([\da-fA-F]{3}){1,2} 表示 [\da-fA-F]{3}或 [\da-fA-F]{6}
用户提供的另一种正则
[\s:](#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3})
[\s:] 匹配空格或冒号
HTML Parser - Part 1
1 | from html.parser import HTMLParser |
Start : html
Start : head
Start : title
Start : body
-> data-modal-target > None
-> class > 1
Start : h1
Start : br
HTML Parser - Part 2
1 | from html.parser import HTMLParser |
>>> Multi-line Comment
[if IE 9]>IE9-specific content
<![endif]
>>> Data
Welcome to HackerRank
>>> Single-line Comment
[if IE 9]>IE9-specific content<![endif]
第一次尝试用了正则
reg = r' <!--.*?>.*>/n.*?<!.*?--> '
re.search(reg,data) 匹配不成功
但是却可以成功匹配到原文text
原因是data是tag之间的内容,去掉标签了,所以匹配不到
Detect HTML Tags, Attributes and Attribute Values
1 | from html.parser import HTMLParser |
head
title
object
-> type > application/x-flash
-> data > your-file.swf
-> width > 0
-> height > 0
param
-> name > quality
-> value > high
Validating UID
1 | # 第一种方法 自己写的 |
'Valid'
思路:
str.isupper(),str.isdigit()
计算大写字母和数字的个数,并判断
len(set(uid)) == 10
用set()去掉重复字符,用len()判断长度
bool(re.search(r'[a-zA-Z0-9]{10}',uid))
判断是否由字母数字组成
1 | # 第二种方法 官方参考答案 |
Invalid
知识点
str.isalnum() 检测字符串是否由字母和数字组成。
str.islower() 检测字符串是否由小写字母组成。
str.isupper() 检测字符串中所有的字母是否都为大写。
str.isdigit() 检测字符串是否只由数字组成。
str.isalpha() 检测字符串是否只由字母组成。
str.isspace() 检测字符串是否只由空格组成。
str.istitle() 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
思路
1 | import re |
['B', '7D', '1D']
B7D1D
['B7D1D']