Python - 解决这个问题的干净方法?

时间:2010-06-02 14:47:02

标签: python data-structures file

我无法选择最佳数据结构来解决问题。

问题如下:

  1. 我有一个嵌套的身份代码列表,其中子列表的长度各不相同。

    li = [['abc', 'ghi', 'lmn'], ['kop'], ['hgi', 'ghy']]
    
  2. 我有一个文件,每行有两个条目;身份代码和号码。

    abc      2.93  
    ghi      3.87  
    lmn      5.96  
    
  3. 每个子列表代表一个群集。我想选择i.d.从每个与其关联的最高编号的子列表中,附加i.d.到新列表并最终将其写入新文件。

    带有数字的文件应该以什么数据结构读入?

    另外,如何迭代所述数据结构以返回i.d.与i.d匹配的最高编号在子列表中?

    谢谢, S: - )

3 个答案:

答案 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)来获得最大值。