iT邦幫忙

0

Python 兩個List 比對以及篩選出相同文字

不明 2022-09-16 00:33:141427 瀏覽
  • 分享至 

  • xImage

IT大神們你們好
想請問若我有兩組List,想互相比較,以S1為主,利用S2所有資料對S1的每行進行分析並取出相同文字,請問要如何寫呢?
https://ithelp.ithome.com.tw/upload/images/20220916/20152717nLoY842N81.png
EX:
S1=['永昕', '公司', '偵測', '資通', '系統', '遭', '病毒', '攻擊', '資安', '團隊', '啟動', '防禦機制', '復原', '作業', '資安', '專業', '人員', '合作', '清除', '病毒', '受', '影響', '資通', '系統', '陸續', '回', '復', '運作', '公司', '持續', '提升', '網路', '資訊', '基礎架構', '管控', '確保', '資料'],['公司', '桃園市', '空服員', '職業工會', '勞資', '協商', '事宜', '桃園市', '空服員', '職業工會', '暫停', '實施', '至本', '公司', '桃園', '企業', '總部', '報到', '先決條件', '拒絕', '協商', '發動', '罷工', '投票', '21', '晚間', '宣布', '罷工', '權']
S2=[公司],[作業],[飛行],[桃園市],[宣布]

希望能得到
['公司', '作業'],['桃園市','宣布']
這樣的資料

嘗試寫過迴圈不過都是空值,無法得到,拜託大家幫忙,謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
japhenchen
iT邦超人 1 級 ‧ 2022-09-16 08:18:41
最佳解答
result = []
for si in s1:    
    ret = []
    for sj in s2:
        if sj in si :
            ret.append(sj)
    result.append(ret)

print(result)
        
    
不明 檢舉

抱歉可以再請問一下,如果
S1=['罷工', '公司', '偵測', '罷工', '罷工'],['公司', '作業', '飛行', '飛行', '勞資', '協商', '事宜', '桃園市', '空服員', '職業工會', '暫停', '實施', '至本', '公司']
S2=[公司],[罷工],[飛行],[宣布]
可以將重複值顯示出來嗎?
像是['罷工', '公司','罷工', '罷工'],['公司','飛行', '飛行','公司']

利用lambda、map、count、sum的技巧

s1=['罷工', '公司', '偵測', '罷工', '罷工'],['公司', '作業', '飛行', '飛行', '勞資', '協商', '事宜', '桃園市', '空服員', '職業工會', '暫停', '實施', '至本', '公司']
s2=['公司','罷工','飛行','宣布']

result = []
for si in s1:    
    ret = []
    for sj in s2:
        if sj in si :
            count = sum(map(lambda word:word==sj, si))
            if count > 1 : #重覆出現大於1次
                ret.append(sj) 
    result.append(ret)

print(result)
        

輸出結果

[['罷工'], ['公司', '飛行']]
不明 檢舉

真的太感謝了!

1
EnergyBoyTW
iT邦見習生 ‧ 2022-09-16 12:09:02

有一個簡單的方法,可以先把S1跟S2的list分別接起來,然後再遍歷
不過我建議可以使用Set這樣時間複雜度可以降到O(n)

不明 檢舉

謝謝您的回答!!

3
I code so I am
iT邦高手 1 級 ‧ 2022-09-17 09:16:49

採用 set 相關函數更簡單,且較有效率。

set(S1).intersection(set(S2))
不明 檢舉

謝謝您的回答!!

我要發表回答

立即登入回答