假设我有以下二维数组:
m_array = [['String A', 1, 1.1, 'haha'],
['String B', 2, 0.9, 'haha'],
['String C', 0, 1.1, 'haha'],
['String D', 3, 0.9, 'haha']]
待办事项:我想获取这个多数组的0索引值,即'String A','String B','String C','String C '并将其存储在一个数组中:s_array
动态。
问题:我使用for循环迭代所有值。这是代码
# create a single dimensional array
s_array = []
# Iterator is the length of the m_array. (Which should be 4; 0-index, 1-index, 2-index and 3-index
iterator = range(len(m_array))
i_array = 0
if(i_array <=iterator):
for str_value in m_array[i_array][0]:
s_array.append(str_value)
此时s_array应该有:
s_array['String A', 'String B', 'String C', 'String D']
但事实并非如此。
我觉得我的代码逻辑出了问题。但我无法确定问题,任何想法?
答案 0 :(得分:2)
使用列表理解:
s_array = [sublist[0] for sublist in m_array]
print s_array
>>> ['String A', 'String B', 'String C', 'String D']
答案 1 :(得分:2)
执行此操作的一种非常紧凑的方法是使用内置的zip
函数。给定
m_array = [['String A', 1, 1.1, 'haha'],
['String B', 2, 0.9, 'haha'],
['String C', 0, 1.1, 'haha'],
['String D', 3, 0.9, 'haha']]
然后
zip(*m_array)
返回
[('String A', 'String B', 'String C', 'String D'), (1, 2, 0, 3), (1.1000000000000001, 0.90000000000000002, 1.1000000000000001, 0.90000000000000002), ('haha', 'haha', 'haha', 'haha')]
那是因为*
“splat”运算符解包m_array
中的项目并将每个项目作为参数传递给zip
。请参阅官方Python教程中的Unpacking Argument Lists。
所以我们只需要提取第一个元组并将其转换为列表。
s_array = list(zip(*m_array)[0])
print(s_array)
<强>输出强>
['String A', 'String B', 'String C', 'String D']
答案 2 :(得分:1)
您正在遍历m_array[i_array][0]
中的每个项目并附加每个项目,而不是附加整个列表。但是,您不需要使用索引,因为您可以遍历m_array
:
s_array = []
for array in m_array:
s_array.append(array[0])
当所有for
循环都添加到列表中时,这表示您可以使用list comprehension:
s_array = [array[0] for array in m_array]
答案 3 :(得分:0)
正如你所看到的那样。我认为,目前最好的情况是list comprehension。
另一种有趣的方法是使用map和itemgetter:
m_array = [['String A', 1, 1.1, 'haha'],
['String B', 2, 0.9, 'haha'],
['String C', 0, 1.1, 'haha'],
['String D', 3, 0.9, 'haha']]
from operator import itemgetter
print(list(map(itemgetter(0), m_array)))
答案 4 :(得分:0)
我认为看到了这个问题。您正在迭代“字符串A”而不是m_array。 m_array [i_array] [0]是“字符串A”,你没有改变i_array的值。
简单修复:
for sublist in m_array:
s_array.append(sublist[0])
我很抱歉,如果这没有帮助,但我不能要求澄清你想要实现的目标(声誉不够)。
答案 5 :(得分:0)
根据对PM 2RING的回答的评论,我做了一些分析测试,结果显示以下结果:
>>> import timeit
>>> timeit.timeit('[x[0] for x in m_array]', "m_array = [['String A', 1, 1.1, 'haha'], ['String B', 2, 0.9, 'haha'],['String C', 0, 1.1, 'haha'],['String D', 3, 0.9, 'haha']]",number = 10**6)
0.3232365940002637
>>> timeit.timeit('list(zip(*m_array))[0]', "m_array = [['String A', 1, 1.1, 'haha'], ['String B', 2, 0.9, 'haha'],['String C', 0, 1.1, 'haha'],['String D', 3, 0.9, 'haha']]",number = 10**6)
0.6186811590014258
注意: 在我的ubuntu 14.04 Box,LENOVO THINKPAD ULTRABOOK和CORE i7上进行测试。