如何使用父 ID 和子 ID 丰富列表列表中的分层数据?

How to enrich hierarchical data in list of lists with parent and child ids?

假设我们有一些分层数据,以列表的形式表示:

list = [
    ['US', 'Central', 'Louisiana', 'Monroe']
    ['US', 'Central', 'Texas', 'Midland']
    ['US', 'Pacific', 'California', 'East Palo Alto']
    ['UK', 'Coastside', 'Sussex', 'Brighton']
]

而且我们喜欢以树结构的形式向每个项目添加分层 ID,因此要实现这一点:

list = [
    [(key1,'US',None), (key3,'Central',key1), (key6,'Louisiana',key3), (key10,'Monroe',key6)]
    [(key1,'US',None), (key3,'Central',key1), (key7,'Texas',key3), (key11,'Midland',key7]
    [(key1,'US',None), (key4,'Pacific',key1), (key8,'California',key4), (key12,'East Palo Alto',key8]
    [(key2,'UK',None), (key5,'Coastside',key2), (key9,'Sussex',key5) (key13,'Brighton',key9]
]

这是否可以用一些优雅的 python 构造来实现?我在 Excel 开始手动执行此操作,但由于初始数据结构非常庞大,这似乎是一项永无止境的任务...

主要有两个任务:

  1. 为每个单词生成密钥。
  2. 从键和您的列表自定义转换。

密钥生成: 我使用简单的逻辑为每个单词生成密钥,我按每个项目迭代列表,并使用计数方法为项目中的每个单词生成唯一的密钥。

注意:您可以根据您的要求更改此逻辑。

自定义转换:现在我们有键和列表,生成列表的新项目,这里主键是为新项目的每个单词添加前一个键,所以使用pre_key 变量存储前一个单词的前一个键并将默认值设置为 None

演示:

输入:

mylist = [
    ['US', 'Central', 'Louisiana', 'Monroe'],
    ['US', 'Central', 'Texas', 'Midland'],
    ['US', 'Pacific', 'California', 'East Palo Alto'],
    ['UK', 'Coastside', 'Sussex', 'Brighton'],
]

代码:

def keyGenerator(mylist):
    result_keys = {}
    count = 1
    for item in mylist:
        for i in item:
            if i not in result_keys:
                result_keys[i] = "key%03d"%count
                count += 1

    return result_keys


def customConversion(mylist, result_keys):
    new_mylist = []
    for item in mylist:
        new_item = []
        pre_key = None
        for i in item:
            current_key = result_keys[i]
            new_item.append((current_key, i, pre_key))
            pre_key = current_key

        new_mylist.append(new_item)

    return new_mylist


mylist = [
    ['US', 'Central', 'Louisiana', 'Monroe'],
    ['US', 'Central', 'Texas', 'Midland'],
    ['US', 'Pacific', 'California', 'East Palo Alto'],
    ['UK', 'Coastside', 'Sussex', 'Brighton'],
]

#- Generate Key to each Word.
result_keys = keyGenerator(mylist)
# Custom Conversion
new_mylist = customConversion(mylist, result_keys)

print "Result:"
for i in new_mylist:
    print i

结果:

Result:
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key003', 'Louisiana', 'key002'), ('key004', 'Monroe', 'key003')]
[('key001', 'US', None), ('key002', 'Central', 'key001'), ('key005', 'Texas', 'key002'), ('key006', 'Midland', 'key005')]
[('key001', 'US', None), ('key007', 'Pacific', 'key001'), ('key008', 'California', 'key007'), ('key009', 'East Palo Alto', 'key008')]
[('key010', 'UK', None), ('key011', 'Coastside', 'key010'), ('key012', 'Sussex', 'key011'), ('key013', 'Brighton', 'key012')]