GVKun编程网logo

在[:index]上使用动态索引进行列表切片(动态索引构建)

11

在这篇文章中,我们将带领您了解在[:index]上使用动态索引进行列表切片的全貌,包括动态索引构建的相关情况。同时,我们还将为您介绍有关ES概念及动态索引结构和索引更新机制、list列表切片方法汇总、

在这篇文章中,我们将带领您了解在[:index]上使用动态索引进行列表切片的全貌,包括动态索引构建的相关情况。同时,我们还将为您介绍有关ES 概念及动态索引结构和索引更新机制、list列表切片方法汇总、Numpy 切片与列表切片、pandas:如何使用多索引进行数据透视?的知识,以帮助您更好地理解这个主题。

本文目录一览:

在[:index]上使用动态索引进行列表切片(动态索引构建)

在[:index]上使用动态索引进行列表切片(动态索引构建)

我需要使用负动态索引([:-index])对列表进行切片。这很容易,直到我意识到如果我的动态索引的值为0,则不返回任何项目,而不是返回整个列表。如何以索引为0时返回整个字符串的方式实现此目的?我的代码很长很复杂,但是基本上这个例子显示了这个问题:

    arr=''test text''    index=2    print arr[:-index]    >>''test te''    #Entire string minus 2 from the right    index=1    print arr[:-index]    >>''test tex''    #Entire string minus 1 from the right    index=0    print arr[:-index]    >>''''           #I would like entire string minus 0 from the right

注意:我正在使用Python 2.7。

答案1

小编典典

另一个有趣的潜在解决方案。

>>> arr = [1, 2, 3]>>> index = 0>>> arr[:-index or None][1, 2, 3]>>> index = 1>>> arr[:-index or None][1, 2]

为了在诸如字符串之类的不可变序列类型上获得更高的性能,可以在切片操作 之前 检查index的值来避免在index为0的情况下完全切片序列。

这里是要测试性能的三个功能:

def shashank1(seq, index):    return seq[:-index or None]def shashank2(seq, index):    return index and seq[:-index] or seqdef shashank3(seq, index):    return seq[:-index] if index else seq

后两者应当是 在指数是0的情况下更快,但也可以是在其它情况下更慢(或更快)。


更新的基准代码: http :
//repl.it/oA5

注意:结果在很大程度上取决于Python的实现。

ES 概念及动态索引结构和索引更新机制

ES 概念及动态索引结构和索引更新机制

 

搜索引擎通过分片(shard)和副本(replica)实现了高性能、高伸缩和高可用。分片技术为大规模并行索引和搜索提供了支持,极大地提高了索引和搜索的性能,极大地提高了水平扩展能力;副本技术为数据提供冗余,部分机器故障不影响系统的正常使用,保证了系统的持续高可用。

 

有2个分片和3份副本的索引结构如下所示:

 

 

 

 

一个完整的索引被切分为0和1两个独立部分,每一部分都有2个副本,即下面的灰色部分。

 

在生产环境中,随着数据规模的增大,只需简单地增加硬件机器节点即可,搜索引擎会自动地调整分片数以适应硬件的增加,当部分节点退役的时候,搜索引擎也会自动调整分片数以适应硬件的减少,同时可以根据硬件的可靠性水平及存储容量的变化随时更改副本数,这一切都是动态的,不需要重启集群,这也是高可用的重要保障。

 

ElasticSearch的Schema free特性给动态提取并索引网页结构化文本内容提供了支持,使用URL的hash值来作为索引的主键(实际开发中使用URL作为主键,这里使用URLhash值是为了方便演示),当网页内容改变后,可以非常方便地更新索引。

 

下面演示了动态索引结构和索引更新机制:

  1.  

  2. 1、提交索引:

curl -XPUT http://localhost:9200/webpage/finance/85723925 -d ''

{

"url" : "http://money.163.com/14/0523/02/9ST8D7KR00253B0H.html",

"title" : "中国非一线城市限购可退出 楼市限购或全面松绑",

"content" : "昨日有消息称,除北上广深之外,其他城市的限购政策可以自行调节,尤其是库存过大的地方。这意味着除四大一线城市之外的30多个限购城市,有可能全面松绑限购政策。"

}

''

 

2、服务器响应:

 

{"_index":"webpage","_type":"finance","_id":"85723925","_version":1,"created":true}

  1.  

  2. 3、查看索引结构:

需要elasticsearch-head插件,下面是安装方法:

 

plugin -install mobz/elasticsearch-head

 

浏览器访问:

 

http://localhost:9200/_plugin/head/

 



 

 

  1. 4、再次提交同样URL的索引,内容改变了:

curl -XPUT http://localhost:9200/webpage/finance/85723925 -d ''

{

"url" : "http://money.163.com/14/0523/02/9ST8D7KR00253B0H.html",

"title" : "标题改了:中国非一线城市限购可退出 楼市限购或全面松绑",

"content" : "内容改了:昨日有消息称,除北上广深之外,其他城市的限购政策可以自行调节,尤其是库存过大的地方。这意味着除四大一线城市之外的30多个限购城市,有可能全面松绑限购政策。"

}

''

5、服务器响应:

 

{"_index":"webpage","_type":"finance","_id":"85723925","_version":2,"created":false}

 

可以看到,版本变为2,created为false,已经成功更新索引

 

  1. 6、再次提交同样URL的索引,不但内容改变了,而且新增了2个字段:

curl -XPUT http://localhost:9200/webpage/finance/85723925 -d ''

{

"url" : "http://money.163.com/14/0523/02/9ST8D7KR00253B0H.html",

"title" : "标题改了:中国非一线城市限购可退出 楼市限购或全面松绑",

"content" : "内容改了:昨日有消息称,除北上广深之外,其他城市的限购政策可以自行调节,尤其是库存过大的地方。这意味着除四大一线城市之外的30多个限购城市,有可能全面松绑限购政策。",

"keywords" : "试探,限购政策,淡出,一次次",

"description" : "中国非一线城市限购可退出 楼市限购或全面松绑,试探 限购政策 淡出 一次次"

}

''

7、服务器响应:

 

{"_index":"webpage","_type":"finance","_id":"85723925","_version":3,"created":false}

 

  1. 8、再次查看索引结构:



 

 

可以看到,新增的两个索引字段已经添加到索引里面了

 

list列表切片方法汇总

list列表切片方法汇总

python为list列表提供了强大的切片功能,下面是一些常见功能的汇总

"""
使用模式: [start:end:step]
    其中start表示切片开始的位置,默认是0
    end表示切片截止的位置(不包含),默认是列表长度
    step表示切片的步长,默认是1
    当start是0时,可以省略;当end是列表的长度时,可以省略.
    当step是1时,也可以省略,并且省略步长时可以同时省略最后一个冒号.
    此外,当step为负数时,表示反向切片,这时start值应该比end值大.
    注意:切片操作创建了一个新的列表.
"""

alist = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(alist[::])  # 返回包含原列表所有元素的新列表
print(alist[::-1])  # 返回原列表的一个逆序列表
print(alist[::2])  # [1, 3, 5, 7, 9] .取列表下标偶数位元素
print(alist[1::2])  # [2, 4, 6, 8]  取列表下标奇数位元素
print(alist[3:6])  # [4, 5, 6]  #取列表中下标3到6的值,步长是1
print(alist[3:6:2])  # [4, 6] #取列表中下标3到6的值,步长是2

print(alist[:10])  # [1, 2, 3, 4, 5, 6, 7, 8, 9]  . end大于列表长度时,取列表中所有元素,省略了步长1.
print(alist[10:]) # []  . 表示从列表的第10位开始取,一直取到列表结果,步长是1.

alist[len(alist):] = [10]  # 在列表的未尾添加一个元素
print(alist) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

alist[:0] = [-1,0]  # 在列表的头部插入元素. alist[:0] 相当于 alist[0:0] 再相当于 alist[0:0:1]
print(alist) #[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

alist[5:5] = [-6]  # 把列表的第6个位置替换成-6. 相当于alist[5:5:1] = [-6]
print(alist) #[-1, 0, 1, 2, 3, -6, 4, 5, 6, 7, 8, 9, 10]

alist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
alist[:3] = [''A'',''B'',''C'',''D'']  # 把alist的前3个元素换成[''A'',''B'',''C'',''D'']
print(alist)  #[''A'', ''B'', ''C'', ''D'', 4, 5, 6, 7, 8, 9]

alist[3:] = [''E'',''F'',''G'']  # 把列表第3个元素之后的元素替换成[''E'',''F'',''G'']
print(alist) # [''A'', ''B'', ''C'', ''E'', ''F'', ''G'']

alist = [1, 2, 3, 4, 5, 6]
alist[::2] = [0]*3 # 替换列表下标是偶数的前三个元素,注意使用该方法时,列表下标是偶数的元素个数必须与后面替换的元素个数相等,否则报错
print(alist) #[0, 2, 0, 4, 0, 6]

alist[::2] = [''a'',''b'',''c''] # 跟上面一样的道理,只是替换的内容不一样
print(alist) # [''a'', 2, ''b'', 4, ''c'', 6]

alist = [1, 2, 3, 4, 5, 6]
alist[:3] = [] # 删除列表中前3个元素
print(alist) # [4, 5, 6]


alist = [1, 2, 3, 4, 5, 6]
del alist[:3]  # 使用del关键字删除列表前3个元素
print(alist) #[4, 5, 6]

alist = [1, 2, 3, 4, 5, 6]
del alist[::2]  # 删除列表元素,下标是偶数位的元素
print(alist) #[2, 4, 6]

 

Numpy 切片与列表切片

Numpy 切片与列表切片

如何解决Numpy 切片与列表切片?

我的清单:

a=[1,2,3,4,5]

b=a[:]

id(a)
>>2181314756864

id(b)
>>2181314855232 (different as slicing creates a new object)

id(a[0])
>>140734633334432

id(b[0])
>>140734633334432 (same)

b[0]=-1

b
>>[-1,5]

a
>>[1,5]  --perfectly fine

但是在 numpy 的情况下:

import numpy as np

l=np.array([1,5])

p=l[:]

id(l)
>>2181315005136

id(p)
>>2181315019840 (different as it creates a new object,which is fine)

id(l[0])

>>2181314995440

id(p[0])
>>2181314995952 (different)

但是:

p[0]=-1

p
>>array([-1,5])

l

>>array([-1,5])

即使 numpy 数组的第一个元素的内存地址不同,l 是 也在更新。 谁能解释一下这背后的概念?

解决方法

id 当作内存地址来讨论有点不切实际。是的,在CPython中,它恰好是一个内存地址,但是什么的地址呢? 不是,碰巧是实际的数字数据,而是描述数字数据的 Python 对象!

在 numpy 中切片会创建一个新的 Python 对象(因此具有不同的 id),但新对象与旧对象共享实际数组的存储空间。

如果 id(A) == id(B),那么,例如,A.shape 不可能与 B.shape 不同!

pandas:如何使用多索引进行数据透视?

pandas:如何使用多索引进行数据透视?

我想对pandas进行一次透视DataFrame,索引是两列,而不是一列。例如,一个字段用于年份,一个字段用于月份,一个“ item”字段显示“
item 1”和“ item 2”,以及一个“ value”字段和数值。我希望索引为年+月。

我设法做到这一点的唯一方法是将两个字段合并为一个,然后再次将其分开。有没有更好的办法?

最少的代码复制到下面。非常感谢!

PS:是的,我知道关键字“ pivot”和“ multi-index”还有其他问题,但是我不知道他们是否/如何帮助我解决这个问题。

import pandas as pd
import numpy as np

df= pd.DataFrame()
month = np.arange(1,13)
values1 = np.random.randint(0,100,12)
values2 = np.random.randint(200,300,12)


df['month'] = np.hstack((month,month))
df['year'] = 2004
df['value'] = np.hstack((values1,values2))
df['item'] = np.hstack((np.repeat('item 1',12),np.repeat('item 2',12)))

# This doesn't work: 
# ValueError: Wrong number of items passed 24,placement implies 2
# mypiv = df.pivot(['year','month'],'item','value')

# This doesn't work,either:
# df.set_index(['year',inplace=True)
# ValueError: cannot label index with a null key
# mypiv = df.pivot(columns='item',values='value')

# This below works but is not ideal: 
# I have to first concatenate then separate the fields I need
df['new field'] = df['year'] * 100 + df['month']

mypiv = df.pivot('new field','value').reset_index()
mypiv['year'] = mypiv['new field'].apply( lambda x: int(x) / 100)  
mypiv['month'] = mypiv['new field'] % 100

我们今天的关于在[:index]上使用动态索引进行列表切片动态索引构建的分享就到这里,谢谢您的阅读,如果想了解更多关于ES 概念及动态索引结构和索引更新机制、list列表切片方法汇总、Numpy 切片与列表切片、pandas:如何使用多索引进行数据透视?的相关信息,可以在本站进行搜索。

本文标签: