将列表/数据框的特定行中的索引处的字符串替换为来自同一索引

时间:2017-08-30 16:13:16

标签: python list loops replace iterator

我有一个像这样的二维数组:

list_of_data = 
    [['Joe', 4, 'MSP', 4, 5, 'cabbage', None], 
    ['Joe', 43, '2TM', 41, 53, 'cabbage', None],
    ['Joe', 24, 'MSP', 44, 55, 'cabbage', None],
    ['Joe', 54, 'MIA', 42, 85, 'cabbage', None],

    ['Tom', 7, '2TM', 4, 52, 'cabbage', None],
    ['Tom', 4, 'LAX', 43, 52, 'cabbage', None],
    ['Tom', 4, 'MCO', 4, 5, 'cabbage', None],

    ['Fred', 4, '2TM', 4, 5, 6, 'cabbage'],
    ['Fred', 4, 'LAG', 4, 5, 6, 'cabbage'],
    ['Fred', 4, 'ITH', 4, 5, 6, 'cabbage']]

这个问题是关于在第二个索引处包含值'2TM'的行/索引。例如:

Joe在他的数据的第二次出现时在索引2处具有值'2TM'。 Tom在他的数据的第一次出现时在索引2处具有值'2TM'。 Fred在他的数据的第一次出现时在索引2处具有值'2TM'。

每次数值'2TM'出现在数据中时,我想将'2TM'替换为接下来两行中相同索引处的值,用连字符分隔。上面的例子将成为以下内容:

list_of_data = 
    [['Joe', 4, 'MSP', 4, 5, 'cabbage', None], 
    ['Joe', 43, 'MSP-MIA', 41, 53, 'cabbage', None],
    ['Joe', 24, 'MSP', 44, 55, 'cabbage', None],
    ['Joe', 54, 'MIA', 42, 85, 'cabbage', None],

    ['Tom', 7, 'LAX-MCO', 4, 52, 'cabbage', None],
    ['Tom', 4, 'LAX', 43, 52, 'cabbage', None],
    ['Tom', 4, 'MCO', 4, 5, 'cabbage', None],

    ['Fred', 4, 'LAG-ITH', 4, 5, 6, 'cabbage'],
    ['Fred', 4, 'LAG', 4, 5, 6, 'cabbage'],
    ['Fred', 4, 'ITH', 4, 5, 6, 'cabbage']]

我尝试过使用替换版。获得可能接近正确代码的方法:

x=0
for row in list_of_data:
    if '2TM' in row:
        list_of_data.replace(list_of_data[2], list_of_data[x+1 + x+2])
    x+=1

这会产生错误消息:

AttributeError: 'list' object has no attribute 'replace'

2 个答案:

答案 0 :(得分:1)

我认为这样做:

list_of_data = [['Joe', 4, 'MSP', 4, 5, 'cabbage', None],
                ['Joe', 43, '2TM', 41, 53, 'cabbage', None],
                ['Joe', 24, 'MSP', 44, 55, 'cabbage', None],
                ['Joe', 54, 'MIA', 42, 85, 'cabbage', None],

                ['Tom', 7, '2TM', 4, 52, 'cabbage', None],
                ['Tom', 4, 'LAX', 43, 52, 'cabbage', None],
                ['Tom', 4, 'MCO', 4, 5, 'cabbage', None],

                ['Fred', 4, '2TM', 4, 5, 6, 'cabbage'],
                ['Fred', 4, 'LAG', 4, 5, 6, 'cabbage'],
                ['Fred', 4, 'ITH', 4, 5, 6, 'cabbage']]

for i in range(len(list_of_data)):
    if list_of_data[i][2] == '2TM':
        list_of_data[i][2] = list_of_data[i+1][2] + '-' + list_of_data[i+2][2]

print(list_of_data)

<强>输出:

[['Joe', 4, 'MSP', 4, 5, 'cabbage', None], ['Joe', 43, 'MSP-MIA', 41, 53, 'cabbage', None], ['Joe', 24, 'MSP', 44, 55, 'cabbage', None], ['Joe', 54, 'MIA', 42, 85, 'cabbage', None], ['Tom', 7, 'LAX-MCO', 4, 52, 'cabbage', None], ['Tom', 4, 'LAX', 43, 52, 'cabbage', None], ['Tom', 4, 'MCO', 4, 5, 'cabbage', None], ['Fred', 4, 'LAG-ITH', 4, 5, 6, 'cabbage'], ['Fred', 4, 'LAG', 4, 5, 6, 'cabbage'], ['Fred', 4, 'ITH', 4, 5, 6, 'cabbage']]

答案 1 :(得分:0)

列表没有替换功能。
试试这个:

for row in list_of_data:
  if '2tm' in row:
    id = list_of_data.index('2tm')
    next_i = id + 1;
    next_again = id + 2;
    list_of_data[id] = list_of_data[next_i] + '-' + list_of_data[next_again]