Python Поиск по списку кортежей и возврат на основе индекса с несколькими условиями - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть список кортежей, который является справочной:

 classes = [('400002', 'Class1'), ('400009', 'Class2'), ('400209', 'Class3')]

У меня также есть список кортежей, которые являются записями:

records = [('Record 1','400002','Memo1'),('Record 2','400003','Memo2'), 
 ('Record 3','400009','Memo3'),('Record 4','L-REF-96-1','Memo4'),('Record 
 5','400002','Memo5')]

Чтобы импортировать, я должен назначить класс и закодировать его:

encoding = 'utf-8'
ref = []
nom = []
memo = []
classr = []
for i in records:
   ref.append(i[0].encode(encoding))
   nom.append(i[1].encode(encoding))
   memo.append(i[2].encode(encoding))

теперь мне нужно назначить класс на основе индекса 2, если он существует, иначе, если str начинается с L-REF, тогда дать ему общий класс, иначе дать ему другой общий класс

Я делал что-то подобное, но это не сработало, оно всегда выполнялось по умолчанию с частью "Else" моего оператора if:

    for c in classes:
       if i[1] == c[0]:
         newclass = c[1]
       elif i[1][5:] == "L-REF":
         newclass = 'general class1'
       else:
         newclass = 'general class2'
    classr.append(newclass.encode(encoding))
 newimportlist = list(zip(ref,nom,memo,classr))

Ожидаемый результат:

[(b'Record 1',b'400002',b'Memo1',b'Class1'),(b'Record 
2',b'400003',b'Memo2',b'general class2'), (b'Record 
3',b'400009',b'Memo3',b'Class2'),(b'Record 4',b'L-REF-96- 
1',b'Memo4',b'general class 1'),(b'Record 
5',b'400002',b'Memo5',b'Class1')]

1 Ответ

0 голосов
/ 06 ноября 2018

Прежде всего ref, nom и memo можно сконструировать проще, перенеся ваш список records.

>>> ref, nom, memo = map(list, zip(*records))
>>> ref
>>> ['Record 1', 'Record 1', 'Record 3', 'Record 4', 'Record 5']
>>> nom
>>> ['400002', '400003', '400009', 'L-REF-96-1', '400002']
>>> memo
>>> ['Memo1', 'Memo1', 'Memo3', 'Memo4', 'Memo5']

Теперь создайте словарь из classes.

>>> classes = [('400002', 'Class1'), ('400009', 'Class2'), ('400209', 'Class3')]
>>> classes_dict = dict(classes)
>>> classes_dict
>>> {'400002': 'Class1', '400009': 'Class2', '400209': 'Class3'}

classr (который, как я предполагаю, является названием ожидаемого результата) теперь можно построить следующим образом:

>>> classr = []
>>> 
>>> for rec, clsno, mem in records:
...:    clsname = classes_dict.get(clsno, 'general class2')
...:    if clsno[:5] == 'L-REF':
...:        clsname = 'general class1'
...:    classr.append((rec, clsno, mem, clsname))
>>>
>>> classr 
>>>
[('Record 1', '400002', 'Memo1', 'Class1'),
 ('Record 1', '400003', 'Memo1', 'general class2'),
 ('Record 3', '400009', 'Memo3', 'Class2'),
 ('Record 4', 'L-REF-96-1', 'Memo4', 'general class1'),
 ('Record 5', '400002', 'Memo5', 'Class1')]
...