2017-10-11 115 views
0

開始選擇IDS我有姓名和年齡的字典:具有相同字母的Python字典

classmates = {'Anne':15, 'Laura':17, 'Michel':16, 'Lee':15, 'Mick':17, 'Liz':16} 

我想選擇所有名稱以字母「L」。我能做到這一點是這樣的:

for name, age in classmates.items(): 
    if "L" in name: 
     print(name) 

Lnames = [name for name in classmates.items() if "L" in name] 

有沒有當我有上百萬個條目的,我需要重複操作上百萬次做的更有效的方法?

+1

看看['str.startswith '](https://docs.python.org/3/library/stdtypes.html#str.startswith) – PRMoureu

+3

不要在名稱中使用''L',它會搜索整個名稱爲''L''。相反,使用'name.startswith(「L」)'這將只是看名字的開始。 –

+0

true,我可以使用'name.startswith(「L」)',但這種方法快多少? – aLbAc

回答

1

一個襯墊List Comprehension

[ key for key in classmates.keys() if key.startswith('L') ] 

#driver值

In : classmates = {'Anne':15, 'Laura':17, 'Michel':16, 'Lee':15, 'Mick':17, 'Liz':16} 
Out : ['Lee', 'Liz', 'Laura'] 

正如其他人所指出的,用的,而不是startswithin找到字符是否出現在開頭。

+0

我不明白'...'或key.startswith('I')在這種情況下是有用的,如果我只想要那些以「L」開頭的... – aLbAc

+0

@aLbAc,您之前的編輯使它看起來你需要用'L'和'I'開始的兩個單詞。自上次編輯以來已更改它。 –

+0

Kaushik NP的權利,我明白你的意思,我修改了。 – aLbAc

0

在您使用某種並行計算之前,搜索時間不會有任何性能。您可以使用@Kaushnik NP提到的過濾來過濾幾個進程上的分割塊數據。
因此,您必須將字典拆分爲4個較小的字典(取決於處理器的核心數量),在每個塊上運行一個工作程序並將公用數據存儲在某處。
下面是一個使用多蟒蛇lib和隊列調度一些工作和存儲工作成果的一個片段:

#!/usr/bin/env python 
import multiprocessing, os, signal, time, Queue 

def do_work(): 
    print 'Work Started: %d' % os.getpid() 
    time.sleep(2) 
    return 'Success' 

def manual_function(job_queue, result_queue): 
    signal.signal(signal.SIGINT, signal.SIG_IGN) 
    while not job_queue.empty(): 
     try: 
      job = job_queue.get(block=False) 
      result_queue.put(do_work()) 
     except Queue.Empty: 
      pass 
     #except KeyboardInterrupt: pass 

def main(): 
    job_queue = multiprocessing.Queue() 
    result_queue = multiprocessing.Queue() 

    for i in range(6): 
     job_queue.put(None) 

    workers = [] 
    for i in range(3): 
     tmp = multiprocessing.Process(target=manual_function, 
             args=(job_queue, result_queue)) 
     tmp.start() 
     workers.append(tmp) 

    try: 
     for worker in workers: 
      worker.join() 
    except KeyboardInterrupt: 
     print 'parent received ctrl-c' 
     for worker in workers: 
      worker.terminate() 
      worker.join() 

    while not result_queue.empty(): 
     print result_queue.get(block=False) 

if __name__ == "__main__": 
    main() 

有關該主題的其他例子,use that link

相關問題