from docarray import Document, DocumentArray
d = Document(uri='https://www.gutenberg.org/files/1342/1342-0.txt').load_uri_to_text()
da = DocumentArray(
Document(text=s.strip()) for s in d.text.replace('\r\n', '').split('.') if s.strip()
)
da.summary()
┌──────────── Documents Summary ────────────┐
│ │
│ Length 6403 │
│ Homogenous Documents True │
│ Common Attributes ('id', 'text') │
│ Multimodal dataclass False │
│ │
└───────────────────────────────────────────┘
┌───────────────────── Attributes Summary ─────────────────────┐
│ │
│ Attribute Data type #Unique values Has empty value │
│ ────────────────────────────────────────────────────────── │
│ id ('str',) 6403 False │
│ text ('str',) 6030 False │
│ │
└──────────────────────────────────────────────────────────────┘
进程已结束,退出代码0
算法题目完整的解决方案。
Geekforgeek - 最少跳跃次数
如果n<=1,则返回0,因为那是目的地。
如果arr[0]==0,那么返回-1作为答案(不可能有跳转)。
现在,用arr[0]初始化maxrange和步骤,用1初始化跳转(因为需要跳转1次)。
现在,从索引1开始迭代,上述数值被更新如下。
首先,我们测试我们是否已经到达数组的末端,在这种情况下,我们只需要返回跳转的变量
if (i == arr.length - 1) return jump;
接下来我们更新maxrange。这等于maxrange和i+arr[i]的最大值(我们可以从当前位置开始走的步数)。
maxrange = max(maxrange,i+arr[i])。
我们用掉了一个步骤来到达当前的索引,所以必须减少步骤。
step--。
如果没有剩余的步数了(即step=0,那么我们肯定使用了一个跳转。因此要增加跳转。由于我们知道有可能达到maxrange,我们再次将步骤初始化为从位置i达到maxReach的步骤数。但在重新初始化步骤之前,我们还要检查一个步骤是否变成了0或负数。在这种情况下,不可能进一步到达。
A-Z Python trick awesome!
Python是世界上最受欢迎、需求量最大的编程语言之一。这有很多原因。
它很容易学习
它具有超强的通用性
它有大量的模块和库
我每天都在使用Python,这是我作为一个数据科学家工作的一个组成部分。在这一过程中,我掌握了一些有用的技巧和提示。
在这里,我试图以A-Z格式分享其中一些。
这些 "技巧 "中的大多数是我在日常工作中使用或偶然发现的东西。有些是我在浏览 Python 标准库文档时发现的。还有一些是我通过PyPi搜索发现的。
然而,功不可没--我在awesome-python.com上发现了其中的四、五个。这是一个由数百个有趣的Python工具和模块组成的策划列表。它值得浏览以获得灵感
所有或任何
Python之所以成为如此受欢迎的语言,其中一个原因是它的可读性和表现力。
人们经常开玩笑说,Python是 "可执行的伪代码"。但当你能写出这样的代码时,就很难不这么认为了。
x = [True, True, False]
if any(x):
print("At least one True")
if all(x):
print("Not one False")
if any(x) and not all(x):
print("At least one True and one False")
x = [True, True, False] 。
if any(x):
print("至少有一个True")
if all(x):
print("没有一个假的")
如果 any(x) and not all(x):
print("至少有一个真和一个假")
bashplotlib
你想在控制台中绘制图形?
$ pip install bashplotlib
你可以在控制台中拥有图形。
收藏
Python 有一些很好的默认数据类型,但有时它们的行为并不完全符合你的意愿。
幸运的是,Python标准库提供了集合模块。这个方便的附加模块为你提供了进一步的数据类型。
from collections import OrderedDict, Counter
# Remembers the order the keys are added!
# 记住键的添加顺序!
x = OrderedDict(a=1, b=2, c=3)
# Counts the frequency of each character
# 计算每个字符的频率
y = Counter("Hello World!")
dir
你有没有想过如何查看一个Python对象的内部,并看到它有哪些属性?当然,你有。
在命令行中
dir()
dir("Hello World")
dir(dir)
当交互式地运行 Python 时,这可能是一个非常有用的功能,而且可以动态地探索你正在工作的对象和模块。
表情符号是的,真的。
$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))
不要假装你不打算尝试它.....👍
Python 流行的一个结果是,总是有新的版本在开发。新的版本意味着新的功能--除非你的版本已经过期。
不过,不用担心。future 模块让你从 Python 的未来版本中导入功能。这简直就像时间旅行,或者魔法,或者别的什么。
from __future__ import
from __future__ import print_function
print("Hello World!")
为什么不尝试一下导入大括号呢?
地理学
对于程序员来说,地理可能是一个具有挑战性的地形(哈,一个双关语!)。但geopy模块让它变得简单得令人不安。
它通过抽象一系列不同的地理编码服务的API而工作。它使你能够获得一个地方的完整街道地址、纬度、经度,甚至海拔高度。
还有一个有用的距离类。它以你喜欢的测量单位计算两个地点之间的距离。
$ pip install geopy
from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)
如何做
被一个编码问题困住了,又想不起之前看到的那个解决方案?需要查看StackOverflow,但又不想离开终端?
那么你需要这个有用的命令行工具。
$ pip install howdoi
向它提出任何问题,它都会尽力返回答案。
$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git
howdoi for loop in java
$ howdoi 撤销git中的提交
不过要注意的是--它是从StackOverflow的顶级答案中抓取代码。它可能并不总是给出最有用的信息...
$ howdoi exit vim
检查
Python 的 inspect 模块对于了解幕后发生的事情非常有用。你甚至可以在自己身上调用它的方法!
下面的代码示例使用 inspect.getource() 打印自己的源代码。它还使用 inspect.getmodule() 来打印它所定义的模块。
最后一行代码会打印出它自己的行号。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
当然,除了这些琐碎的用途外,事实证明 inspect 模块对于了解你的代码正在做什么非常有用。你也可以用它来编写自我记录的代码。
Jedi
Jedi 库是一个自动完成和代码分析库。它使写代码更快,更有成效。
除非你正在开发你自己的IDE,否则你可能会对使用Jedi作为一个编辑器插件最感兴趣。幸运的是,已经有大量的插件可用了
不过,你可能已经在使用Jedi了。IPython项目使用了Jedi的代码自动补全功能。
**kwargs
在学习任何语言的过程中,都有许多里程碑式的事件。对于 Python 来说,理解神秘的 **kwargs 语法可能算作一个。一个字典对象前面的双星号让你把字典的内容作为命名参数传递给函数。字典的键是参数名称,而值是传递给函数的值。你甚至不需要叫它 kwargs
dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
print(a + b)
return
# these do the same thing:
someFunction(**dictionary)
someFunction(a=1, b=2)
当你想编写可以处理未事先定义的命名参数的函数时,这很有用。
列表推导式
在 Python 中编程,我最喜欢的事情之一是它的列表推导式
这些表达式使我们可以很容易地写出非常干净的代码,读起来几乎像自然语言。
你可以在这里阅读更多关于如何使用它们的信息。
numbers = [1,2,3,4,5,6,7]
evens = [x for x in numbers if x % 2 is 0]
odds = [y for y in numbers if y not in evens]
cities = ['London', 'Dublin', 'Oslo']
numbers = [1,2,3,4,5,6,7]。
偶数 = [x for x in numbers if x % 2 is 0)
赔率 = [y for y in numbers if y not in evens]
城市 = ['伦敦', '都柏林', '奥斯陆']
def visit(city):
print("Welcome to "+city)
for city in cities:
visit(city)
Map ()
Python通过一些内置的功能支持函数式编程。其中最有用的是map()函数--特别是与lambda函数结合使用。
x = [1, 2, 3]
y = map(lambda x : x + 1 , x)
# prints out [2,3,4]
print(list(y))
在上面的例子中,map()对x中的每个元素都应用了一个简单的lambda函数,它返回一个map对象,这个对象可以被转换为一些可迭代的对象,比如list或者tuple。
newspaper3k
如果你还没有看到它,那么请准备好让你的头脑被 Python 的报纸模块所震撼。
它让你从一系列领先的国际出版物中检索新闻文章和相关的元数据。你可以检索图片、文本和作者姓名。它甚至有一些内置的NLP功能。
因此,如果你想在你的下一个项目中使用BeautifulSoup或其他一些DIY网络抓取库,请为自己节省时间和精力,用$ pip安装newspaper3k代替!
pip install newspaper3k
操作符重载
Python提供了对操作符重载的支持,这是一个让你听起来像一个合法的计算机科学家的术语。
它实际上是一个简单的概念。想过为什么Python允许你使用+运算符来加数字,也允许你连接字符串吗?这就是操作符重载的作用。
你可以定义一些对象,这些对象以它们自己特定的方式使用 Python 的标准运算符符号。这可以让你在与你所处理的对象相关的情况下使用它们。
class Thing:
def __init__(self, value):
self.__value = value
def __gt__(self, other):
return self.__value > other.__value
def __lt__(self, other):
return self.__value < other.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something + nothing
pprint
Python 的默认打印函数完成了它的工作。但是试着打印出任何大的、嵌套的对象,其结果是相当难看的。
这就是标准库的pretty-print模块发挥作用的地方。它以一种易于阅读的格式打印出复杂的结构化对象。
对于任何使用非简单数据结构的 Python 开发者来说,这是一个必备的工具。
import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)
队列
Python支持多线程,标准库的Queue模块为此提供了便利。
这个模块让你实现队列数据结构。这些数据结构可以让你根据特定的规则来添加和检索条目。
先入先出"(或FIFO)队列让你按照对象的添加顺序来检索它们。后进先出"(LIFO)队列让你首先访问最近添加的对象。
最后,优先级队列让你根据对象的排序顺序来检索它们。
下面是一个如何在 Python 中使用队列进行多线程编程的例子。
检索"repr"。
当在 Python 中定义一个类或一个对象时,提供一种以字符串表示该对象的 "官方 "方式是很有用的。比如说
>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>
这使调试代码变得容易多了。把它添加到你的类定义中,如下所示。
class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)
sh
Python是一种伟大的脚本语言。有时,使用标准的os和子进程库会让人有点头疼。
sh 库提供了一个巧妙的替代方案。
它可以让你像调用普通函数一样调用任何程序--对于自动化工作流程和任务来说非常有用,而且都是在 Python 中进行。
import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')
类型提示
Python 是一种动态类型的语言。当你定义变量、函数、类等时,你不需要指定数据类型。
这允许快速的开发时间。然而,很少有比由简单的类型问题引起的运行时错误更令人讨厌的事情。
从Python 3.5开始,你可以选择在定义函数的时候提供类型提示。
def addTwo(x : Int) -> Int:
return x + 2
你也可以定义类型别名。
from typing import List
Vector = List[float]
Matrix = List[Vector]
def addMatrix(a : Matrix, b : Matrix) -> Matrix:
result = []
for i,row in enumerate(a):
result_row =[]
for j, col in enumerate(row):
result_row += [a[i][j] + b[i][j]]
result += [result_row]
return result
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)
返回结果
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)
虽然不是强制性的,但类型注解可以使你的代码更容易理解。
它们还允许你使用类型检查工具,在运行时之前捕获那些游离的TypeErrors。如果你在做大型复杂的项目,可能是值得的!
uuid
产生通用唯一标识(或称 "UUIDs")的一个快速而简单的方法是通过 Python 标准库的 uuid 模块。
import uuid
user_id = uuid.uuid4()
print(user_id)
这将创建一个随机的128位数字,几乎肯定是唯一的。
事实上,有超过2¹²个可能的UUID可以被生成。这是超过5个十亿(或5,000,000,000,000,000,000,000,000,000,000)。
在一个给定的集合中找到重复的概率是非常低的。即使有一万亿个UUID,存在重复的概率也远远低于十亿分之一。
对于两行代码来说,这是相当不错的。
虚拟环境
Virtual environments
这可能是我最喜欢的Python东西。
你有可能同时在多个 Python 项目上工作。不幸的是,有时两个项目会依赖于同一个依赖的不同版本。你要在你的系统上安装哪个?
幸运的是,Python 对虚拟环境的支持让你拥有两个世界中最好的东西。在命令行中。
python -m venv my-project
source my-project/bin/activate
pip install all-the-modules
https://docs.python.org/3/tutorial/venv.html
现在你可以在同一台机器上运行独立的Python版本和安装。已排序!
维基百科
维基百科有一个伟大的API,允许用户以编程方式访问一个无与伦比的完全免费的知识和信息。
wikipedia模块使访问这个API变得几乎?
输入维基百科
import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)
像真实的网站一样,该模块提供了对多语言、页面消歧义、随机页面检索的支持,甚至还有一个donate()方法。
xkcd
幽默是Python语言的一个关键特征--毕竟,它是以英国喜剧小品节目Monty Python's Flying Circus命名的。Python的许多官方文档都引用了该节目最著名的短剧。
不过,这种幽默感并不局限于文档中。试着运行一下下面这一行。
import antigravity
永不改变,Python永不改变。
YAML
YAML 是 "YAML Ain't Markup Language "的缩写。它是一种数据格式化语言,是JSON的一个超集。
与JSON不同,它可以存储更复杂的对象并引用自己的元素。你还可以写注释,这使得它特别适合于编写配置文件。
PyYAML模块让你在Python中使用YAML。用以下方式安装。
$ pip install pyyaml
然后导入到你的项目中。
import yaml
PyYAML允许你存储任何数据类型的Python对象,以及任何用户定义的类的实例。
zip 命令
最后一个技巧,它真的是一个很酷的技巧。是否需要从两个列表中形成一个字典?
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
zip()内置函数接收一些可迭代对象并返回一个图元列表。每个元组按其位置索引将输入对象的元素分组。
你也可以通过调用*zip()来 "解压 "对象。
谢谢你的阅读!
Python技巧的A-Z--希望你已经为你的下一个项目找到了有用的东西。Python 是一种非常多样化和完善的语言,所以肯定会有很多我没有包括的功能。请留言,分享你自己喜欢的Python技巧。
网友评论