将一个列表中的两个项目附加到Python中的新列表中

时间:2016-06-05 13:41:46

标签: python list

我有一个目前的列表:

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <title>Untitled Document</title>
</head>

<body>
  <form action="testing.php" method="post">
    <div id="addingitem">
      <input type="text" name="lineitem_1" id="item" value="1" maxlength="2" size="2">
      <input type="text" name="materialcode_1" placeholder="Material Code" maxlength="18" size="18">
      <input type="button" name="addnew" id="Add_New()" onClick="AddNew()" value="New Item">
    </div>
  </form>
</body>

</html>

第一个元素,&#39; 130公里&#39;对应于第11个元素(&#39; $ 266.07&#39;)等等,对于列表的其余部分。我试图将这些关系中的每一个转换为一个列表,然后将其附加到另一个列表&#39; sort_list&#39;形成一份清单清单。

我尝试使用以下代码执行此操作。

new_list = ['130 kms', '46 kms', '169 kms', '179 kms', '53 kms', '128 kms', '97 kms', '152 kms', '20 kms', '94 kms', '$266.07', '$174.14', '$187.01', '$488.69', '$401.53', '$106.88', '$398.33', '$493.87', '$205.43', '$248.14']

但它给了我错误&#34;列表索引必须是整数,而不是str&#34;。那么这是否意味着我无法将字符串附加到列表中,或者是否存在某种解决方法?

这是我期待的输出:

**#new_list as written above**
sort_list = []

for l in range(len(new_list)):
    for item in new_list:
        sort_list.append(new_list[item]+[item+10]).split()

6 个答案:

答案 0 :(得分:1)

您可以使用列表推导来创建嵌套列表。这就是诀窍:

result = []

for i in range(len(new_list)/2):
    result.append([new_list[i],new_list[i+10])

请注意,如果您有不同的输入字符串长度,则应将最后一行更改为:

result.append([new_list[i],new_list[i+len(new_list)/2]])  // instead of +10

这会产生以下result列表:

[['130 kms', '$266.07'], ['46 kms', '$174.14'], ['169 kms', '$187.01'], ['179 kms', '$488.69'], ['53 kms', '$401.53'], ['128 kms', '$106.88'], ['97 kms', '$398.33'], ['152 kms', '$493.87'], ['20 kms', '$205.43'], ['94 kms', '$248.14']]

答案 1 :(得分:1)

您的代码正在破坏,正如错误所解释的那样,因为您循环遍历字符串列表,然后使用该字符串作为列表索引,这是不允许的。

如果我正确理解了您的目标,您希望结果是列表,例如:

>> [['130 kms', '$266.07'],['46 kms','$174.14'], ...]

如果我们假设列表的前半部分是距离,下半部分是价格,最简单:

new_list = ['130 kms', '46 kms', '169 kms', '179 kms', '53 kms', '128 kms', '97 kms', '152 kms', '20 kms', '94 kms', '$266.07', '$174.14', '$187.01', '$488.69', '$401.53', '$106.88', '$398.33', '$493.87', '$205.43', '$248.14']
n_items = len(new_list) / 2
sorted_list = [[new_list[i], new_list[i+n_items]] for i in range(n_items)]

更具可读性:

n_items = len(new_list) / 2
distances = new_list[:n_items]
prices = new_list[n_items:]
sorted_list = zip(distances, prices)

注意第二个选项返回元组列表而不是列表列表。

答案 2 :(得分:0)

按如下方式拆分列表:

a = ['130 kms', '46 kms', '169 kms', '179 kms', '53 kms', '128 kms', '97 kms', '152 kms', '20 kms', '94 kms']

b = ['$266.07', '$174.14', '$187.01', '$488.69', '$401.53', '$106.88', '$398.33', '$493.87', '$205.43', '$248.14']

然后执行zip(a,b),返回:

In [19]: list(zip(a, b))
Out[19]: 
[('130 kms', '$266.07'),
 ('46 kms', '$174.14'),
 ('169 kms', '$187.01'),
 ('179 kms', '$488.69'),
 ('53 kms', '$401.53'),
 ('128 kms', '$106.88'),
 ('97 kms', '$398.33'),
 ('152 kms', '$493.87'),
 ('20 kms', '$205.43'),
 ('94 kms', '$248.14')]

这是一个班轮(因为你不想手工拆分):

list(zip(new_list[:int(len(new_list)/2+1)], new_list[int(len(new_list)/2):]))

答案 3 :(得分:0)

new_list = ['130 kms', '46 kms', '169 kms', '179 kms', '53 kms', '128 kms', '97 kms', '152 kms', '20 kms', '94 kms', '$266.07', '$174.14', '$187.01', '$488.69', '$401.53', '$106.88', '$398.33', '$493.87', '$205.43', '$248.14']

new_list1 = []

for x in new_list:
    try:
        new_list1.append([x,new_list[new_list.index(x)+10]])
    except:
        break
for x in new_list1:
    print (x)

输出

>>> 
['130 kms', '$266.07']
['46 kms', '$174.14']
['169 kms', '$187.01']
['179 kms', '$488.69']
['53 kms', '$401.53']
['128 kms', '$106.88']
['97 kms', '$398.33']
['152 kms', '$493.87']
['20 kms', '$205.43']
['94 kms', '$248.14']
>>> 

答案 4 :(得分:0)

这可能是一个经典的XY问题。我想知道为什么你不会备份并以此步骤所需的形式收集数据。但是,我会发一个答案,因为我认为现有的一个问题是你必须知道列表中每个项目的数量和位置。

我的解决方案并不是假设您知道第一个数据项的位置,它与@Jeremy Gordon的答案类似但不同。

new_list = ['130 kms', '46 kms', '169 kms', '179 kms', '53 kms', '128 kms', '97 kms', '152 kms', '20 kms', '94 kms', '$266.07', '$174.14', '$187.01', '$488.69', '$401.53', '$106.88', '$398.33', '$493.87', '$205.43', '$248.14']

distances = []

for item in new_list:
    if 'kms' in item: # belongs in distances list
        distances.append(item)
        continue
    else:
        first_price = new_list.index[item] # not a distance so first price
        prices = new_list[first_price:]  # starting from the first price grab the rest of the items
        break do not need to iterate further

combined = [[distance,prices[n]] for n, distance in enumerate(distances)]  create the desired list

答案 5 :(得分:0)

这是它: 容易列表理解

NewList1 = [[value,new_list [index]] for(index,value)枚举(new_list [:11],11)]