在一个记录中连接多个值而不重复

use*_*216 5 python vba

我有一个像下面这样的dbf表,它是两个表中一对多连接的结果.我希望从一个Taxlot id字段中获得唯一的区域值.

表名:输入表
tid -----区
1 ------ A
1 ------ A
1 ------ B
1 ------ C
2 ----- - D
2 ------ E
3 ------ C

理想的输出表表名:输入表
tid ----- zone
1 ------ A,B,C
2 ------ D,E
3 ------ C

我得到了一些帮助,但无法让它发挥作用.

inputTbl = r"C:\temp\input.dbf"
taxIdZoningDict = {}
searchRows = gp.searchcursor(inputTbl)
searchRow = searchRows.next()
while searchRow:
   if searchRow.TID in taxIdZoningDict:
      taxIdZoningDict[searchRow.TID].add(searchRow.ZONE)
   else:
      taxIdZoningDict[searchRow.TID] = set() #a set prevents dulpicates!
      taxIdZoningDict[searchRow.TID].add(searchRow.ZONE)
   searchRow = searchRows.next()

outputTbl = r"C:\temp\output.dbf"
gp.CreateTable_management(r"C:\temp", "output.dbf")
gp.AddField_management(outputTbl, "TID", "LONG")
gp.AddField_management(outputTbl, "ZONES", "TEXT", "", "", "20")
tidList = taxIdZoningDict.keys()
tidList.sort() #sorts in ascending order
insertRows = gp.insertcursor(outputTbl)
for tid in tidList:
   concatString = ""
   for zone in taxIdZoningDict[tid]
      concatString = concatString + zone + ","
   insertRow = insertRows.newrow()
   insertRow.TID = tid
   insertRow.ZONES = concatString[:-1]
   insertRows.insertrow(insertRow)
del insertRow
del insertRows
Run Code Online (Sandbox Code Playgroud)

Mor*_*ock 0

这是一个用 Python 快速编写的代码,可能会满足您的需求,而且不需要太多麻烦。

import collections

d = collections.defaultdict(list)

with open("input_file.txt") as f:   
    for line in f:
        parsed = line.strip().split()
        print parsed
        k = parsed[0]
        v = parsed[2]
        d[k].append(v)

for k, v in sorted(d.iteritems()):
    s = " ----- "
    v = list(set(v)) # Must be a library function to do this
    v.sort()
    print k, s,
    for j in v:
        print j,
    print
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 请注意,处理文件时: 1) **始终** 使用上下文管理器,也就是说 `with open("input_file.txt") as f:` 以确保文件无论如何都会关闭,2)永远不要使用`for line in f.readlines():`,这是浪费的。使用“for line in f:”。(类似地,您可以使用 `for k, v in d.iteritems()` 循环字典的项目,使用 `iteritems` 来避免创建不必要的列表。)此外,通常拼写为 `some_string.split(" ")` `some_string.split()`。 (2认同)