這是一種可能的方式:
lists = [['E12.2', 'E16.1', 'E15.1'],
['E10.1', 'I11.2', 'I10.1_27353757'],
['E16.1', 'E18.1', 'E17.3'],
['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
['E55.1', 'E57.1', 'E56.1','E88.1'],
['U22.3', 'U22.6_13735517', 'U23.1']]
for lst in lists:
if len(lst) != 3 and not any('_' in item or 'U' in item for item in lst):
print(lst)
# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
這裏感興趣的是在生成器表達式使用any
。爲了分解它,這遍歷每個item
在lst
並且應用測試以查看_
或U
是否在其中。對於列表中的每個項目,該列表理解導致True
/False
。 any
然後查找第一個True
。如果找到,它立即返回True
。如果沒有找到,則返回False
。
編輯
好了,我們已經清楚地搬進了「就因爲你可以並不意味着你應該」,領土,但這裏的是集成在評論中引入的新條件的方案:
from collections import Counter
import re
lists = [['E12.2', 'E16.1', 'E15.1'],
['E10.1', 'I11.2', 'I10.1_27353757'],
['E16.1', 'E18.1', 'E17.3'],
['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
['E55.1', 'E57.1', 'E56.1','E88.1'],
['U22.3', 'U22.6_13735517', 'U23.1'],
['E7.2', 'E9.5', 'E9.3']]
for lst in lists:
if (len(lst) != 3 and not any('_' in item or 'U' in item for item in lst) and
(Counter(match.groups(1) for match in [re.match(r'E(\d+)\.', item) for item in lst] if match is not None)
.most_common(1) or [(None, 1)])[0][1] == 1):
print(lst)
# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
Counter
計數的事情,re.match
嘗試後E
s中數字和.most_common(1) or [(None, 1)]
是確保即使沒有匹配的元素,我們仍然可以索引到結果,並尋找最偉大的麻木呃出現。
雖然前面的代碼沒問題,但現在這是糟糕的代碼,應該將其移出到另一個函數。 :-)
爲了好玩,發生器表達式也可以用'map(set('U _')。intersection,l)' –
hi smarx,alex替換我有另外一行表示['E7.2' ,'E9.5','E9.3']我想在E之後不需要任何東西的情況下給出另一個條件(在這種情況下,在兩種情況下都是E9),我該如何刪除這些行呢?我可以想到的一件事是分裂,如果有一種方法可以將所有行列入同一行。 – AishwaryaKulkarni
爲此,E9.3與E9.5相同,但可以推測(從前面的例子),E55.1與E56.1不同。是對的嗎?(你是否將它解釋爲一個E後跟一個十進制數並忽略小數點後的所有內容?) – smarx