>

부트 캠프 준비 과정에서 문제가 발생했습니다. 문제는 사전에 인수로 사용하는 함수를 사용하고 키 중 하나의 값 유형을 확인한 다음 조건이 충족되면 해당 값을 업데이트하려고합니다. 이 기능은 사전 목록에서 특정 목록 요소가 제공 될 때 효과적입니다.

이 함수를 맵에 중첩하여 함수를 하나의 특정 요소를 전달하는 대신 전체 사전 목록에 적용하려고하면 문제가 발생합니다.

이전 자료에서 설명했듯이 괄호없이 첫 번째지도 인수로 함수를 제공하려고 시도한 후 이터레이터를 색인이없는 사전의 기본 목록으로 설정하려고 시도했습니다. :] 슬라이스, [0 : len {list)] 슬라이스, [0 : 2] 슬라이스로서 모두 사용할 수 없습니다.

# list of dictionaries to be updated, trimmed to 3 for brevity
restaurants = [{'name': 'Fork & Fig',
  'price': '$$',
  'is_closed': False,
  'review_count': 610},
 {'name': 'Salt And Board',
  'price': '$$',
  'is_closed': False,
  'review_count': 11},
 {'name': 'Stripes Biscuit',
  'price': '$$',
  'is_closed': True,
  'review_count': 20}] 
#function in question, changes the $ strings to numbers
def format_restaurant(restaurant): 
    if type(restaurant['price']) == str:
        restaurant['price'] = len(restaurant['price'])
    return restaurant 
# inputting a single dictionary entry works great:
format_restaurant(restaurants[1]) # {'is_closed': False, 'name': 'Fork & Fig', 'price': 2, 'review_count': 610}
# Here comes the sticking point. The directions are: 
#"Now write another function called map_format_restaurants using map, that 
# uses above function and returns a list of restaurants with each of them 
# formatted with price pointing to the respective number."
# My answer that I think should work, but doesn't:
def map_format_restaurants(restaurants):
    map(format_restaurant, restaurants)
    return restaurants
# When this function is called, the list of dictionaries comes out just as it went in:
map_format_restaurants(restaurants)

사전 목록에서 각 'price'키 값에 대해 코드가 '$'를 1로 또는 '$$'를 2로 변경하기를 원하지만 그중 아무것도 변경되지 않습니다. 오류 메시지가 표시되지 않습니다.

목록의 마지막 dict 항목보기 :

{'name': 'Stripes Biscuit',
  'price': '$$',
  'is_closed': True,
  'review_count': 20}]

로 변경해야합니다 :

{'name': 'Stripes Biscuit',
  'price': 2,
  'is_closed': True,
  'review_count': 20}]

대신 들어간 것처럼 나왔습니다.

나는 이것이 누군가에게 좋은 소프트볼이라고 확신하지만, 나는 그것을 칠 수 없다. 모든 통찰력은 대단히 감사하겠습니다.


  • 답변 # 1

    파이썬 3에서 map  게으른 발전기입니다. 함수를 사용할 때, 즉 요소를 요청할 때만 함수를 실행합니다. 그것이 일어날 때까지, 그것은 단지 map 로 거기 앉아  대기 중입니다.

    map 를 소비하는 상당히 표준적인 방법   list 를 구축하는 것입니다  그것에서 :

    def map_format_restaurants(restaurants):
        return list(map(format_restaurant, restaurants))
    
    

    이것은 완전히 새로운 목록을 만들지 만 기존 목록을 그 자리에서 수정한다는 것을 기억하십시오. 즉, 새 목록을 작성할 필요가 없으며 부작용에 대해서만 반복자를 사용하는 경우 알고있는 가장 빠른 방법을 사용할 수 있습니다.

    from collections import deque
    deque(map(format_restaurant, restaurants), maxlen=0)
    
    

    와이즈 비즈  매개 변수는 maxlen 를 보장합니다  iterator를 사용할 때 비워 둡니다.

    그러나 pyzwyz에 대한 리턴 값을 가지면서 모든 것을 적절하게 수정하고 있다고 가정하면  다소 비유 론적입니다. 간단한 deque 를 사용하는 것이 좋습니다  대신 루프 :

    format_restaurant
    
    

  • 답변 # 2

    for  새로운 목록을 만듭니다. 기존 목록을하지 않습니다. 따라서 함수를 다음과 같이 수정하십시오 :

    def format_restaurant(restaurant):
        ...
        # no return value
    for restaurant in restaurants:
         format_restaurant(restaurant)
    
    

    마찬가지로이 함수의 반환 값을 할당해야합니다 :

    map()
    
    
    def map_format_restaurants(restaurants): return map(format_restaurant, restaurants)

관련 자료

  • 이전 dao - sqlite 모델 클래스와 다른 사용자 지정 모델 클래스가있는 페이징 라이브러리 - 기계적 인조 인간
  • 다음 cURL 명령을 실행하는 Java 프로그램을 중지 할 때까지 cURL -o 명령이 파일로 출력되지 않습니다