說明一下這個代碼所有的考量.

首先是 順序,這裡的順序有兩個部分,一個是輸出行的順序,一個是項目合併之後的順序.我們觀察到:

pr333 sd23a2 thisisa 1001 1005

pr333 sd23a2 sentence 1001 1005

pr33w sd11aa we 1022 1002

pr33w sd11aa have 1022 1002

pr33w sd11aa adream 1033 1002

要變成:

pr333 sd23a2 thisisa|sentence 1001 1005

pr33w sd11aa we|have|adream 1022|1033 1002

輸出行的順序要顧及: pr333 先於 pr33w

項目合併之後的順序要顧及: thisisa 先於 sentence

這代表我們 使用的資料型態必須要能維持順序

其次是速度,我們都知道序列型態是線性搜尋,為了效率,使用映射型態是比較好的.

三種考量之下,就如同 moling3650 大所言,OrderedDict 是個好選擇.這可以解決行輸出的問題,不過合併項目由於只需要用到 key 而不需要用到 value 所以使用 OrderedDict 有點可惜,不過目前標準庫中沒有 OrderSet 的選擇,所以只好將就著用一下.

有關於 OrderedDict 可以參閱 OrderedDict

最後 linkse7en 大的觀點非常好,這類文檔處理的問題,如果能夠邊讀邊寫,邊讀邊處理絕對是 有效率(因為只需要進行一次文檔的走訪)(討論請見評論部分 moling 大的觀點) 且 省資源(馬上輸出完畢,不必浪費空間儲存資料).但因為考慮到有可能重複的 數據對 有可能跨行出現,所以依然是多花一點資源來確保穩固性.

代碼(Python3):

from collections import OrderedDict

data = OrderedDict()

DPAIR = slice(0,2)

MSG = slice(2,None)

with open('data.txt', 'r') as reader:

for line in reader:

line = line.strip()

items = tuple(line.split())

msgs = data.setdefault(items[DPAIR], [OrderedDict({}) for msg in items[MSG]])

for idx, msg in enumerate(msgs):

msg.setdefault(items[MSG][idx], None)

for (dp1, dp2), msgs in data.items():

print(dp1, dp2, *['|'.join(msg.keys()) for msg in msgs])

關於代碼部分也做個說明(也許我寫的不是最好,但有些心得可以分享).

首先是 slice 類的應用.

身為一個 Python programmer,我們對 序列型態 取切片(slicing) 應該都不陌生.

items[start:stop:step]

其實可以寫成:

items[slice(start, stop, step)]

# example

items[:5] 可以寫成 items[slice(0,5)]

items[7:] 可以寫成 items[slice(7,None)]

那好處是什麼呢?

我們可以利用這個特性對切片進行命名,以這個問題的代碼為例,原本要取出 數據對 與 其他資料 可以用:

items = tuple(line.split())

items[0:2] # 這是用來做 key 的數據對

items[2:] # 這是其他的資料項

但是這種方式其實閱讀起來不夠清晰,我們可以幫這兩個範圍取個名字,所以:

DPAIR = slice(0,2)

MSG = slice(2,None)

items[DPAIR] # 這是用來做 key 的數據對

items[MSG] # 這是其他的資料項

我們可以用比較優雅易讀的方式來從 items 中取值.

其次是 setdefault,這個函數相當實用,舉例:

dic.setdefault(key, default_value)

如果字典(或其他相符的映射型態)中存在鍵值 key 則回傳 dic[key] 否則回傳自動在字典中插入新的鍵值對 dic[key] = default_value 並且回傳 default_value.

最後一個想分享的是嵌套 tuple 的拆解:

for (a, b), c, d in ((1,2) ,3, 4):

print(a, b, c, d) # 印出 1 2 3 4

這個技巧可以很方便的用來拆解巢狀嵌套的 tuple.

感謝大家不嫌我話多...

python合并word内容相同单元格_python:怎样合并文档中有重复部分的行?相关推荐

  1. python合并word全部_python:怎样合并文档中有重复部分的行?

    說明一下這個代碼所有的考量. 首先是 順序,這裡的順序有兩個部分,一個是輸出行的順序,一個是項目合併之後的順序.我們觀察到: pr333 sd23a2 thisisa 1001 1005 pr333 ...

  2. python合并word表格单元格_合并Word 表格中单元格

    //合并Word 表格中单元格 procedure mergeWordCell; var WordApp: TWordApplication; WordDoc: TWordDocument; DocI ...

  3. 数据合并设计_八秒搞定合并相同内容的单元格,你却加班了1小时

    Excel有一种操作相信大家都见到过,那就是对单元格区域进行合并操作.对于绝大多数人来说,合并多个单元格都是手动点击合并来操作,但是当数据量较大或者我们需要对相同内容的单元格合并的时候,这种操作就用不 ...

  4. excel单元格内容拆分_Excel批量合并相同内容的单元格

    因为我平常工作中整理数据会经常需要批量合并单元格,所以我各处学习,整理了如下批量合并相同内容单元格的方法,以下有WPS的应用截图,也有excel的应用截图,但原理是一样的,供大家参考. 在日常办公中经 ...

  5. Excel函数 - 批量合并相同内容的单元格

    问题:如下图所示,我想把相同的种类合并到1个单元格中.由图1变为图2. 第一步:我们在C列标题行下面的第一行(即c2单元格)写下这样的公式"=IF(A2=A1,C1,C1+1) " ...

  6. python批量合并单元格_Python批量合并有合并单元格的Excel文件详解

    合并单元格 合并单元格相信大家都会,比如下面这段简单的代码就可以实现: app='Word' word=win32.gencache.EnsureDispatch('%s.Application' % ...

  7. 利用Python做excel文本合并(根据左侧单元格,快速合并右侧单元格内容)

    前言:昨天获得一个数据处理的小需求,比较简单,用VBA也能做,不过最近Python用的比较多,所以用Python写了,效率也很快. 需求: 有一张总表,如下图所示 需要根据左侧的工号和姓名,合并右侧获 ...

  8. python csv合并单元格_python中合并表格的两种方法

    合并表格要注意的是设置表格的表头,也就是是将表格第一列设置为合并表格的索引,这样合并表格的时候就会合并两个表格第一列的元素相同的行. 方法一:使用join合并import numpy as np im ...

  9. python搜索pdf内容所在页码_使用pyPDF从文档中检索页码

    答案很好.但是,由于稍后(dreamer)请求了一个工作代码示例,而且我今天也遇到了同样的问题,所以我想添加一些注释.pdf结构并不统一:您可以依赖的东西很少,因此任何工作代码示例都不太可能适合每个人 ...

最新文章

  1. Windows上安装Apache
  2. 1/3 常用符号:类型说明符
  3. volatile与synchronized 同步原理基础讲解
  4. Linux三大共享文件的方法
  5. 利用课间10分钟,打造一个恶劣天气实时预警系统
  6. 基于上下文化图注意力网络的知识图谱的条目推荐
  7. mybatis使用generator生成器生成entity,mapper,xml模版类及自己写sql情况处理
  8. 目前可以用的短信验证码平台哪个比较好?
  9. Vue3 Hooks 模块化抽离
  10. QLabel实现超链接,设置超链接颜色,去掉超链接下划线方法
  11. matlab信道容量函数,信息论-matlab求信道容量(迭代法) | 学步园
  12. iOS开发-Please sign in with an app-specific password. You can create one at appleid.apple.com
  13. 硬核!用Arduino打造纯机械装置模拟数字时钟
  14. https://blog.csdn.net/watermelon_learn/article/details/88902117
  15. 股票 汇率 基金 手机号码 天气 等 常用免费接口
  16. 计算机er保研选网络安全方向怎么样?
  17. Android 自动化触发GC
  18. Unity动画状态的获取和常用判断(逐步完善)
  19. 315/433M 无线发射芯片 XL4456 功能和用途简单介绍
  20. T23334 美人松的高度 题解

热门文章

  1. C# WinForm给Button按钮或其它控件添加快捷键响应
  2. 135.137.138.139.445端口分析
  3. BCH在支付上的优势
  4. Coinbase调查发现,BCH上市前没有发生不当交易
  5. Vue中动态设置页面title
  6. 区块链开发公司能做什么?对企业未来市场有何帮助?
  7. mongodb自动关闭:页面太小,无法完成操作
  8. Instruments of Xcode
  9. 在asp.net中使用jQuery实现类似QQ网站的图片切割效果
  10. 一笔画问题 (DFS或并查集)