2016-08-24 64 views
0

标题有点误导,因为我不够聪明,想出一个恰当的标题来描述我正在尝试完成的内容,所以我对此表示歉意。希望我可以用下面的描述来补偿这一点。连接列表中的两个字符串

我正在从一本需要一点清理的书开始练习,然后才能执行任何其他操作。我有一个列表,其中一些中的元素(不是全部)中的元素需要通过串联进行更新(或者其他更有效的方式,如果人们建议他们的话)。为了更好地解释,这里是从列表中的该列表片:

[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

每个列表中的元素对应一个用户ID,设备,操作系统,分别为性别和provinceID。如果你看看第三和第五个列表,这就是我的困境出现的地方 - 你会注意到'Windows'和'XP'是单独的字符串,它们应该是单个字符串,也就是'Windows XP ”,使这两个字符串出现在它们各自列出了其他的之中:

['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'] 
['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'] 

其余的名单上面,从这个问题开脱,所以没有必要对其进行修改。因此,我试图开发一些合理的方法,通过它我可以将这两个字符串加入到具有这种分离的列表中(我在上面的示例中没有显示其他列表,这些列表以类似方式显示,例如'Windows ''7'而不是'Windows 7'),但我还没有这样做。有没有这样做的“干净”的方式,或者我不得不求助于创建一个循环,删除这些字符串,然后插入两个串联?

+0

是' 'Android''和'' unknown''应该要连接到''的Android unknown''? –

+1

@JohnColeman我猜测这是未知的性别... –

+0

是您提供实际源数据的示例列表,还是发布您已完成的任何处理? –

回答

0

对于您的具体情况,如果它始终是潜在问题的平台,则可以检查列表中是否有太多项目,如果是,则将第二和第三个索引中的项目组合在一起。如果您需要更广泛的解决方案,请澄清您的问题。

NUM_ITEMS_PER_LIST = 5 
lists = [ 
    ['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
    ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
    ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
    ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
    ['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
    ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25'] 
] 

for l in lists: 
    if len(l) > NUM_ITEMS_PER_LIST: 
     l[2] = '{} {}'.format(l[2], l[3]) 
     del l[3] 

print(lists) 

输出

[ 
    ['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
    ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
    ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], 
    ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
    ['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], 
    ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25'] 
] 
2

你可以使用一个简单的列表理解:

>>> data = [['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

然后:

>>> [item if len(item) == 5 else item[:2] + [' '.join(item[2:4])] + item[4:] for item in data] 
[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], ['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 
+0

我也冒昧地说,如果你可以说第一列和最后两列都没问题,那么你可以使用下面的方法使它更普遍:'[el [:2] + [''.join(el [2: -2])] + el [-2:] for el in data]'(至少在这种情况下,你并没有处理绝对偏移量,如果你可以缩小它的范围,只能在已知的好区域之间.. 。然后代码变得更简单,长度检查可以被删除) –

+0

@JohnColeman这个工程很漂亮!非常感谢你! – erik7970

0

使用map

mylist = [['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], ['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

map(lambda x: x[:2]+[" ".join(x[2:4])]+x[4:] if len(x) == 6 else x, mylist) 

输出:

[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']]