我无法选择最佳数据结构来解决问题。
问题如下:
我有一个嵌套的身份代码列表,其中子列表的长度各不相同。
li = [['abc', 'ghi', 'lmn'], ['kop'], ['hgi', 'ghy']]
我有一个文件,每行有两个条目;身份代码和号码。
abc 2.93
ghi 3.87
lmn 5.96
每个子列表代表一个群集。我想选择i.d.从每个与其关联的最高编号的子列表中,附加i.d.到新列表并最终将其写入新文件。
带有数字的文件应该以什么数据结构读入?
另外,如何迭代所述数据结构以返回i.d.与i.d匹配的最高编号在子列表中?
谢谢, S: - )
答案 0 :(得分:4)
您可以将文件读入字典(string => int),然后使用列表推导从每个子列表中获取最高的身份代码。
d = {}
with open("data", 'rb') as data:
for line in data:
key, val = line.split(' ')
d[key] = float(val)
ids = [max(sublist, key=lambda k: d[k]) for sublist in li]
对于Python 2.4,请使用:
ids = []
for sublist in li:
subnums = map(lambda x: d[x], sublist)
ids.append(sublist[subnums.index(max(subnums))])
如上所述,这是O(n)。
答案 1 :(得分:2)
我的解决方案假设您只需要最高数字而不是与之关联的ID。
我按照Matthew的建议阅读了字典中的身份代码和数字
NEW_LIST = []
ID2NUM = {}
with file('codes') as codes:
for line in codes:
id, num = line.rstrip().split()
ID2NUM[id] = num
我添加了一些数字,所以每个id都有一个值。我的ID2NUM
看起来像这样:
{'abc': 2.9300000000000002,
'ghi': 3.8700000000000001,
'ghy': 1.2,
'hgi': 0.40000000000000002,
'kop': 4.3499999999999996,
'lmn': 5.96}
然后处理列表li
:
for l in li:
NEW_LIST.append(max([d[x] for x in l]))
>>> NEW_LIST
[5.96, 4.3499999999999996, 1.2]
要将新列表写入文件,每行一个数字:
with file('new_list', 'w') as new_list:
new_list.write('\n'.join(NEW_LIST))
答案 2 :(得分:0)
如何将每个子列表存储为二叉搜索树?您平均可以获得O(log n)搜索性能。
另一种选择是使用max-heaps而你得到O(1)来获得最大值。