使用集合中的位置创建集合和列表

时间:2016-08-08 10:08:04

标签: python dictionary

我需要创建一些消息的ID以及原始列表中的位置。该代码用于对消息进行排序,稍后根据ID处理它们。

以下作品,可读,但速度慢。

import numpy as np
IDs=np.array([354,45,45,34,354])#example, the actual array is huge

Dict={}
for counter in xrange(len(IDs)):
    try:
        Dict[IDs[counter]].append(counter)
    except:
        Dict[IDs[counter]]=[counter]
print(Dict)
#{354: [0, 4], 34: [3], 45: [1, 2]}

任何想法如何加快速度?不需要对列表进行排序。稍后在代码中使用如下,然后丢弃dict

for item in Dict.values():
    Position_of_ID=Position[np.array(item)]
    ...

3 个答案:

答案 0 :(得分:1)

尝试使用defaultdictenumerate

from collections import defaultdict    
Dict = defaultdict(list)
for i,id in enumerate(IDs):
    Dict[id].append(i)

(使用tryexcept是个坏主意if the exceptions aren't rare

答案 1 :(得分:0)

我提出的最快的代码就是这个。它做了更多的数学,不是那么可读,我并不自豪,但它更快(即使有大型数组):

    Sorted_positions_of_IDs=np.argsort(IDs,kind='mergesort')
    SortedIDs=IDs[Sorted_positions_of_IDs]
    Position=0    
    Position_last=-1
    Dict={}
    while(Position<len(Sorted_positions_of_IDs)):
        ID=SortedIDs[Position]
        Position_last=np.searchsorted(SortedIDs,ID,side='right')
        Dict[ID]=Sorted_positions_of_IDs[Position:Position_last]
        Position=Position_last

无论如何,好的想法将不胜感激。

答案 2 :(得分:0)

Mutch更快地使用&#34; dictcompression&#34;

  public void loginapi(){
    String username = user.getText().toString();
    String password = passwd.getText().toString();

    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);

    Call<List<Akses>> call = apiService.getEmployeeAkses(donat, username, password);
    call.enqueue(new Callback<List<Akses>>() {
        @Override
        public void onResponse(Call<List<Akses>> call, Response<List<Akses>> response) {
            String waduser,wadpass;

            // you should use (ArrayList<Akses>) response.body; 

            ArrayList<Akses> aksesList = (ArrayList<Akses>) response.body;


            waduser = aksesList.get(0).getUsername().toString();
            wadpass = aksesList.get(0).getPassword().toString();
        }

        @Override
        public void onFailure(Call<List<Akses>> call, Throwable t) {
            Log.e("Errore : ", t.getMessage());
            Toast.makeText(getApplicationContext(), "Terjadi Kesalahan masalah API", Toast.LENGTH_SHORT);
        }
    });

}