Python list help (incrementing count, appending)

前端 未结 5 1717
小蘑菇
小蘑菇 2020-12-21 14:59

I am trying to connect google\'s geocode api and github api to parse user\'s location and create a list out of it.

The array (list) I want to create is like this:

相关标签:
5条回答
  • 2020-12-21 15:33

    This would be better stored as a dictionary, indexed by city name. You could store it as two dictionaries, one dictionary of tuples for latitude/longitude (since lat/long never changes):

    lat_long_dict = {}
    lat_long_dict["San Francisco"] = (x, y)
    lat_long_dict["Mumbai"] = (x1, y1)
    

    And a collections.defaultdict for the count, so that it always starts at 0:

    import collections
    city_counts = collections.defaultdict(int)
    
    city_counts["San Francisco"] += 1
    city_counts["Mumbai"] += 1
    city_counts["San Francisco"] += 1
    # city counts would be
    # defaultdict(<type 'int'>, {'San Francisco': 2, 'Mumbai': 1})
    
    0 讨论(0)
  • 2020-12-21 15:33

    Python has a pre-baked class specifically for counting occurences of things: its called collections.Counter. If you can generate an iterator that gives successive tuples (city, lat, lon) from your input data (perhaps with a generator expression), simply passing that into Counter will directly give you what you're looking for. eg,

    >>> locations = [('Miami', 1, 1), ('San Francisco', 2, 2), ('Mumbai', 3, 3), ('Miami', 1, 1), ('Miami', 1, 1)]
    >>> Counter(locations)
    Counter({('Miami', 1, 1): 3, ('San Francisco', 2, 2): 1, ('Mumbai', 3, 3): 1})
    

    If you need to be able to add more locations as the program runs instead of batching them, put the relevant tuples into that Counter's update method.

    0 讨论(0)
  • 2020-12-21 15:33

    This is sort of an amalgamation of all the other recommended ideas:

    from collections import defaultdict
    
    inputdata = [('Miami', 'x2', 'y2'),
                 ('San Francisco', 'x', 'y'),
                 ('San Francisco', 'x4', 'y4'),
                 ('Mumbai', 'x1', 'y1'),
                 ('Cairo', 'x3', 'y3')]
    
    counts, coords = defaultdict(int), defaultdict(list)
    
    for location, lat, lon in inputdata:
        coords[location].append((lat,lon))
        counts[location] += 1
    
    print counts, coords
    

    This uses defaultdict, which, as you can see allows for an easy way to both:

    1. count the number of occurrences by city
    2. keep lat/lon pairs intact

    RETURNS:

    defaultdict(<type 'int'>, {'Miami': 1, 'San Francisco': 2, 'Cairo': 1, 'Mumbai': 1}) 
    defaultdict(<type 'list'>, {'Miami': [('x2', 'y2')], 'San Francisco': [('x', 'y'), ('x4', 'y4')], 'Cairo': [('x3', 'y3')], 'Mumbai': [('x1', 'y1')]})
    

    This answer makes an (unverified) assumption that the granularity of your lat/lon pairs are unlikely to repeat, but that in fact you're only interested in making counts-by-city.

    0 讨论(0)
  • 2020-12-21 15:35

    How about using a python dict? You can read about them here

    http://docs.python.org/2/tutorial/datastructures.html#dictionaries

    Here is a sample implementation:

    // Create an empty dictionary.
    dat = {}
    
    if dat.has_key(location):
        dat[location] = dat[location] + 1
    else:
        dat[location] = 1
    
    0 讨论(0)
  • 2020-12-21 15:36

    With collections.Counter, you could do :

    from collections import Counter
    
    # initial values
    c=Counter({("Mumbai", 1, 2):5, ("San Francisco", 3,4): 4})
    
    #adding entries
    c.update([('Mumbai', 1, 2)])
    print c  # Counter({('Mumbai', 1, 2): 6, ('San Francisco', 3, 4): 4})
    
    c.update([('Mumbai', 1, 2), ("San Diego", 5,6)])
    print c  #Counter({('Mumbai', 1, 2): 7, ('San Francisco', 3, 4): 4, ('San Diego', 5, 6): 1})
    
    0 讨论(0)
提交回复
热议问题