Lists inside dictionary and how to look for particular value

Tim Chase python.list at tim.thechases.com
Sun Jan 26 15:00:43 EST 2014


On 2014-01-26 10:47, mick verdu wrote:
> z={ 'PC2': ['02:02:02:02:02:02', '192.168.0.2', '200'],
>     'PC3': ['03:03:03:03:03:03', '192.168.0.3', '200'],
>     'PC1': ['01:01:01:01:01:01', '192.168.0.1', '200'] }
> 
> My solution:
> 
> z=raw_input("Enter Host, Mac, ip and time")
> t=z.split()
> t[0]=z[1:]
       ^
First, I don't think that this is doing what you want it to.  I
suspect you want something like

  data = {}
  while True:
    z = raw_input("Enter Host, Mac, IP and Time")
    try:
      host, mac, ip, time = z.split()
    except ValueError:
      print("Could not parse. Quitting")
      break
    existing = get_existing(data, mac, ip)
    if existing:
      print("%s/%s already exists as %s" % (
        mac, ip, existing)
    else:
      data[host] = [mac, ip, time]

> How to search for a particular value inside list. First, I want the
> user to input hostname and ip. e.g. PC1 and 192.168.0.1, then need
> to find out if 192.168.0.1 has already been assigned to some host
> in dictionary. In this case I would need to skip for search inside
> list of user input host.

You have two main choices, depending on the size of the data and how
frequently you're running the queries:

1) you can search through the entire dataset every time for any sort
of match.  If the list is reasonably small or you're not throwing
thousands of queries-per-second at it, this is insignificant and can
be pretty straight-forward:

  def get_existing(data, mac, ip):
    for hostname, (m, i, _) in data.items():
      if mac == m or ip = i:
        return hostname
    return None

2) You can maintain separate data structures for the
reverse-mapping.  This has a much faster lookup time at the cost of
more space and maintaining the reverse mappings.  The whole thing
might look more like

  ip_to_hostname = {}
  mac_to_hostname = {}
  data = {}
  while True:
    z = raw_input("Enter Host, MAC, IP and Time")
    try:
      host, mac, ip, time = z.split()[:4]
    except ValueError:
      print("Could not parse. Quitting")
      break
    if mac in mac_to_hostname:
      print("MAC already exists as %s" % mac_to_hostname[mac])
    elif ip in ip_to_hostname:
      print("IP already exists as %s" % ip_to_hostname[ip])
    # elif host in data:
    #   mac2, ip2, _ = data[host]
    #   if (mac, ip) != (mac2, ip2):
    #     print("Hostname already entered (%s/%s)" % (mac2, ip2))
    else:
      data[host] = [mac, ip, time]
      ip_to_hostname[ip] = host
      mac_to_hostname[mac] = host

-tkc







More information about the Python-list mailing list