Searching for uniqness in a list of data
Alexander Schmolck
a.schmolck at gmail.com
Wed Mar 1 13:02:15 EST 2006
Alexander Schmolck <a.schmolck at gmail.com> writes:
> The easiest way to do this is to have a nested dictionary of prefixes: for
> each prefix as key add a nested dictionary of the rest of the split as value
> or an empty dict if the split is empty. Accessing the dict with an userinput
> will give you all the possible next choices.
Oops I was reading this too hastily -- forgot to compact and take care of sep.
You might also want to google 'trie', BTW.
(again, not really tested)
def addSplit(d, split):
if len(split):
if split[0] not in d:
d[split[0]] = addSplit({}, split[1:])
else:
addSplit(d[split[0]], split[1:])
return d
def compactify(choices, parentKey='', sep=''):
if len(choices) == 1:
return compactify(choices.values()[0],
parentKey+sep+choices.keys()[0], sep)
else:
for key in choices.keys():
newKey, newValue = compactify(choices[key], key, sep)
if newKey != key: del choices[key]
choices[newKey] = newValue
return (parentKey, choices)
def queryUser(chosen, choices, sep=''):
next = raw_input('So far: %s\nNow type one of %s: ' %
(chosen,choices.keys()))
return chosen+sep+next, choices[next]
wordList=['1p2m_3.3-1.8v_sal_ms','1p2m_3.3-1.8v_pol_ms','1p3m_3.3-18.v_sal_ms']
choices = compactify(reduce(addSplit,(s.split('_') for s in wordList), {}),
sep='_')[1]
chosen = ""
while choices:
chosen, choices = queryUser(chosen, choices, '_')
print "You chose:", chosen
More information about the Python-list
mailing list