2016-11-04 9 views
2

아래의 샘플 코드는 모든 실행중인 procces를 검색하여 인쇄합니다. 그들은 세 번째 예제 인 here과 마지막으로 here을 작성했습니다. 문제는 왜 처음 프로세스 만 원하는대로 정렬 된 프로세스를 검색하는지 파악할 수 없다는 것입니다.사전에 따라 목록을 정렬하는 파이썬 람다 함수

기능 구조가 lambda과 관련이 있다고 생각합니다. 하지만 올바르게 실행되는 샘플은 처음에 p for 변수의 변수를 p.dict 사전과 섞어서 막히게 만듭니다.

첫번째 샘플 :

import psutil 

procs = [] 

for p in psutil.process_iter(): 
    try: 
     p.dict = p.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(p) 

processes = sorted(procs, key=lambda p: p.dict['name'], reverse=False) 

print(processes) 

번째 샘플 : 최초 샘플

import psutil 

procs = [] 

for proc in psutil.process_iter(): 
    try: 
     procs_dic = proc.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(proc) 

processes = sorted(procs, key=lambda ordem: procs_dic['name'], reverse=False) 

print(processes) 

답변

3

두 번째 코드 스 니펫의 lambda는 전달 된 객체가 무엇이든 관계없이 동일한 사전에서 'name'을 찾습니다. 그게 어떻게 가능할 수 있니?

세 번째 단계는 프로세스를 정렬하지 않는 것처럼 보입니다. 나는 그 질문과 무슨 상관이 있는지 모르겠다.

두 번째로 첫 번째 조각을 켜했습니다 변화는 분명 처음

가 p.dict 사전에 문의 로컬 P 변수를 혼합하는 것 같은 우려에 의해 동기를

도와 주시면 기꺼이 도와 드리겠습니다.하지만 어떤 문제인지 이해하지 못할 수도 있습니다. 아마도 다음과 같은 것이 도움이 될 수 있습니까? 두 개의 변수가 여기에 p이라고합니다. 첫 번째는 루프 오버 프로세스에서 사용됩니다. 매 라운드마다 루프의 값은 프로세스 객체이며, 'name'에 대한 항목을 포함하는 dict 속성을 해당 프로세스 객체에 제공합니다. 두 번째는 익명 함수 (lambda)에 대한 인수입니다.이 값은 항상 프로세스 객체이기도합니다.원하는 경우 다른 이름을 지정할 수 있지만 아무 것도 부러 뜨리지는 않지만 사실은 분명히 알 수 있습니다.이 작은 코드에서 p은 값을 프로세스 객체로 사용하는 변수입니다. 그러나 "혼란스러워지고있는"것은 없습니다.

+0

사실,'처리 = 정렬에 끝에서 두 번째 행을 변경 : @JordanMcQueen 팁 다음'(프록 키 = 람다 ORDEM ordem.dict [ '이름', 역방향 = 거짓). 그러나,'proc.dict = proc.as_dict ([ 'pid', 'name'])''try' 다음의 행으로 변경 한 후에 만 ​​작업을 완료 할 수 있습니다. –

+0

오른쪽. 그래서 당신은'proc'와'ordem'에 변수'p'와'proc'의 이름을 바꾸 었다는 것을 제외하고는 첫 번째 스 니펫에서와 똑같은 코드를 가지고 있습니다. –

1

lambda 기능 일부 VAR p 소요 p.dict['name']를 반환한다. 여기 px 또는 원하는대로 변경할 수 있습니다. 단지 자리 표시 자일뿐입니다.

두 번째 샘플 key=lambda ordem: procs_dic['name'], reverse=False)에서 lambdaordem이라는 항목을 취하고 procs_dic['name']을 반복해서 반환합니다.

키가 작동하는 방식은 sorted입니다. 요소를 반복하고 정렬 할 때 각 요소의 lambda을 호출하여 정렬 할 값을 결정합니다.

내 생각 엔 당신이이처럼 보이도록 2 예제 코드의 sorted 라인을 원하는 것입니다 : Process.name()는 프로세스의 이름을 반환

processes = sorted(procs, key=lambda x: x.name(), reverse=False)

하는 것으로.

1

Process 사전에 정보가 포함 된 사전을 사용해보십시오.

그런 다음 해당 프로세스에 대한 사전 값을 name으로 정렬하십시오.

print(*sorted(proc_dict, lambda x: proc_dict[x]['name']))